Namedtuple en Python

Python admet un tipus de diccionari de contenidors anomenat ' namedtuple() 'present al mòdul' col·leccions '. En aquest article veurem com crear un NameTuple i operacions sobre NamedTuple.

Què és NamedTuple a Python?

En Python NamedTuple està present dins de mòdul de col·leccions . Proporciona una manera de crear estructures de dades senzilles i lleugeres similars a una classe, però sense la sobrecàrrega de definir una classe completa. Igual que els diccionaris, contenen claus que tenen un valor determinat. Al contrari, admet tant l'accés des de clau-valor com la iteració de la funcionalitat que diccionaris mancança.

Sintaxi de Python NamedTuple

namedtuple(typename field_names)

  • typename - El nom del namedtuple.
  • field_names: la llista d'atributs emmagatzemats a namedtuple.

Exemple: La implementació del codi de NamedTuple es mostra a Python .

Python
   # Python code to demonstrate namedtuple()   from   collections   import   namedtuple   # Declaring namedtuple()   Student   =   namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using index   print  (  'The Student age using index is : '     end  =  ''  )   print  (  S  [  1  ])   # Access using name   print  (  'The Student name using keyname is : '     end  =  ''  )   print  (  S  .  name  )   

Sortida
The Student age using index is : 19 The Student name using keyname is : Nandini  

Operacions a NamedTuple

A continuació es mostren les operacions següents que es poden fer utilitzant namedtuple():

  • Creeu un NameTuple
  • Operacions d'accés
  • Operacions de conversió
  • Operacions addicionals

Creeu un NameTuple a Python

Això crea una nova classe namedtuple utilitzant la funció namedtuple() de la col·leccions mòdul. El primer argument és el nom de la nova classe i el segon argument és una llista de noms de camp.

Python
   from   collections   import   namedtuple   Point   =   namedtuple  (  'Point'     [  'x'     'y'  ])   p   =   Point  (  x  =  1     y  =  2  )   print  (  p  .  x     p  .  y  )   

Sortida
1 2  

Operacions d'accés

Namedtuples a Python ofereixen maneres convenients d'accedir als seus camps. A continuació es mostren algunes operacions d'accés proporcionades a Python per a NamedTuple:

  • Accés per índex
  • Accés per nom clau
  • Accediu amb getattr()

Accés per índex

Els valors d'atribut de namedtuple() estan ordenats i es pot accedir mitjançant el número d'índex, a diferència dels diccionaris que no són accessibles per índex. En aquest exemple estem accedint a l'estudiant mitjançant l'índex.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using index   print  (  'The Student age using index is : '     end  =  ''  )   print  (  S  [  1  ])   

Sortida
The Student age using index is : 19  

Accés per nom clau

També es permet l'accés per nom de clau com en els diccionaris. En aquest exemple estem utilitzant keyname per accedir al nom de l'estudiant.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using name   print  (  'The Student name using keyname is : '     end  =  ''  )   print  (  S  .  name  )   

Sortida
The Student name using keyname is : Nandini  

Accediu amb getattr()

Aquesta és una altra manera d'accedir al valor donant namedtuple i valor clau com a argument. En aquest exemple, estem utilitzant getattr() per accedir a l'identificador de l'estudiant al namedtuple donat.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Access using getattr()   print  (  'The Student DOB using getattr() is : '     end  =  ''  )   print  (  getattr  (  S     'DOB'  ))   

Sortida
The Student DOB using getattr() is : 2541997  

Operacions de conversió

Namedtuples ofereix unes quantes operacions de conversió útils per treballar amb altres tipus de dades Python . A continuació es mostren les següents operacions de conversió que es proporcionen per a namedtuples a Python:

  • Utilitzant _make()
  • Utilitzant _asdict()
  • S'utilitza l'operador ** (doble estrella).

Conversió mitjançant _make()

Aquesta funció s'utilitza per retornar a namedtuple() de l'iterable passat com a argument. En aquest exemple estem utilitzant _make() per convertir la llista 'li' en namedtuple.

Python
   # importing 'collections' for namedtuple()   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # initializing iterable   li   =   [  'Manjeet'     '19'     '411997'  ]   di   =   {  'name'  :   'Nikhil'     'age'  :   19     'DOB'  :   '1391997'  }   # using _make() to return namedtuple()   print  (  'The namedtuple instance using iterable is : '  )   print  (  Student  .  _make  (  li  ))   

Sortida
The namedtuple instance using iterable is : Student(name='Manjeet' age='19' DOB='411997')  

Operació de conversió utilitzant _asdict()

Aquesta funció torna el OrderedDict() tal com es construeix a partir dels valors assignats de namedtuple(). En aquest exemple estem utilitzant _asdict() per convertir la llista d'entrada en instància namedtuple.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # initializing iterable   li   =   [  'Manjeet'     '19'     '411997'  ]   # initializing dict   di   =   {  'name'  :   'Nikhil'     'age'  :   19     'DOB'  :   '1391997'  }   # using _asdict() to return an OrderedDict()   print  (  'The OrderedDict instance using namedtuple is : '  )   print  (  S  .  _asdict  ())   

Sortida
The OrderedDict instance using namedtuple is : OrderedDict([('name' 'Nandini') ('age' '19') ('DOB' '2541997')])  

S'utilitza l'operador '**' (doble estrella).

Aquesta funció s'utilitza per convertir un diccionari en namedtuple(). En aquest exemple estem utilitzant '**' per convertir la llista d'entrada en namedtuple.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # initializing iterable   li   =   [  'Manjeet'     '19'     '411997'  ]   # initializing dict   di   =   {  'name'  :   'Nikhil'     'age'  :   19     'DOB'  :   '1391997'  }   # using ** operator to return namedtuple from dictionary   print  (  'The namedtuple instance from dict is : '  )   print  (  Student  (  **  di  ))   

Sortida
The namedtuple instance from dict is : Student(name='Nikhil' age=19 DOB='1391997')  

Operacions addicionals 

Hi ha algunes operacions addicionals que es proporcionen a Python per a NamedTples:

  • _camps
  • _substituir()
  • __nou__()
  • __getnewargs__()

_camps

Aquest atribut de dades s'utilitza per obtenir tots els noms clau de l'espai de noms declarat. En aquest exemple estem utilitzant _fields per obtenir tots els noms clau de l'espai de noms declarats.

Python
   import   collections   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # using _fields to display all the keynames of namedtuple()   print  (  'All the fields of students are : '  )   print  (  S  .  _fields  )   

Sortida
All the fields of students are : ('name' 'age' 'DOB')  

_substituir()

_replace() és com str.replace() però apunta a camps anomenats (no modifica els valors originals). En aquest exemple estem utilitzant _replace() per substituir un nom de "Nandini" a "Manjeet".

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # ._replace returns a new namedtuple    # it does not modify the original   print  (  'returns a new namedtuple : '  )   print  (  S  .  _replace  (  name  =  'Manjeet'  ))   

Sortida
returns a new namedtuple : Student(name='Manjeet' age='19' DOB='2541997')  

__nou__()

Aquesta funció retorna una nova instància de la classe Student prenent els valors que volem assignar a les claus de la tupla anomenada. En aquest exemple estem utilitzant __new__() per retornar una nova instància de la classe Student.

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   # Student.__new__ returns a new instance of Student(nameageDOB)   print  (  Student  .  __new__  (  Student    'Himesh'    '19'    '26082003'  ))   

Sortida
Student(name='Himesh' age='19' DOB='26082003')  

__getnewargs__()

Aquesta funció retorna la tupla anomenada com una tupla normal. En aquest exemple estem fent el mateix utilitzant __getnewargs__().

Python
   import   collections   # Declaring namedtuple()   Student   =   collections  .  namedtuple  (  'Student'     [  'name'     'age'     'DOB'  ])   # Adding values   S   =   Student  (  'Nandini'     '19'     '2541997'  )   H  =  Student  (  'Himesh'    '19'    '26082003'  )   # .__getnewargs__ returns the named tuple as a plain tuple   print  (  H  .  __getnewargs__  ())   

Sortida
('Himesh' '19' '26082003')  
  1. Mutabilitat : les instàncies d'una classe poden ser mutables o immutables mentre namedtuple els casos són immutables.
  2. Mètodes : Les classes poden contenir mètodes (funcions) mentre namedtuple principalment proporciona una manera d'emmagatzemar dades amb camps amb nom.
  3. Herència : Les classes admeten l'herència permetent la creació de jerarquies complexes mentre que namedtuple no admet l'herència.

Quina diferència hi ha entre tiped dict i namedtuple?

  1. Comprovació de tipus : TypedDict (de la typing module) proporciona consells de tipus per als diccionaris amb parells clau-valor específics útils per a la verificació de tipus. namedtuple no proporciona indicacions de tipus.
  2. Mutabilitat : TypedDict les instàncies són mutables i permeten canvis als valors while namedtuple els casos són immutables.
  3. Estructura : TypedDict s'utilitza per definir l'estructura dels diccionaris amb tipus específics per a cada clau mentre que namedtuple proporciona camps amb nom per a dades semblants a tupla.