Namedtuple u Pythonu

Python podržava vrstu rječnika spremnika pod nazivom ' namedtuple() '. U ovom članku ćemo vidjeti kako stvoriti NameTuple i operacije na NamedTuple.

U Piton modul zbirki . Omogućuje način stvaranja jednostavnih laganih struktura podataka sličnih klasi, ali bez dodatnih troškova definiranja cijele klase. Kao i rječnici, oni sadrže ključeve koji su raspršeni na određenu vrijednost. Naprotiv, podržava i pristup iz ključa/vrijednosti i iteraciju funkcionalnosti koja rječnicima nedostatak.

  • field_names - Popis atributa pohranjenih u namedtuple.

Primjer: Implementacija koda NamedTuple prikazana je u Piton .

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  )   

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

Ispod su sljedeće operacije koje se mogu izvesti pomoću namedtuple():

  • Stvorite NameTuple
  • Operacije pristupa
  • Operacije pretvorbe
  • Dodatne operacije

Stvorite NameTuple u Pythonu

Ovo stvara novu namedtuple klasu pomoću funkcije namedtuple() iz zbirke modul. Prvi argument je naziv nove klase, a drugi argument je popis naziva polja.

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

Izlaz
1 2  

Operacije pristupa

Namedtuples u Pythonu pružaju praktične načine pristupa njihovim poljima. Ispod su neke operacije pristupa u Pythonu za NamedTuple:

  • Pristup po indeksu
  • Pristup pomoću ključnog imena
  • Pristup pomoću getattr()

Pristup putem indeksa

Vrijednosti atributa namedtuple() su raspoređene i može im se pristupiti pomoću indeksnog broja za razliku od rječnika koji nisu dostupni putem indeksa. U ovom primjeru pristupamo studentovom pomoću indeksa.

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  ])   

Izlaz
The Student age using index is : 19  

Pristup pomoću ključnog imena

Pristup pomoću naziva ključa također je dopušten kao u rječnicima. U ovom primjeru koristimo keyname za pristup imenu učenika.

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  )   

Izlaz
The Student name using keyname is : Nandini  

Pristup pomoću getattr()

Ovo je još jedan način pristupa vrijednosti davanjem namedtuple i vrijednosti ključa kao argumenta. U ovom primjeru koristimo getattr() za pristup ID-u učenika u zadanoj namedtuple.

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'  ))   

Izlaz
The Student DOB using getattr() is : 2541997  

Operacije pretvorbe

Namedtuples pružaju nekoliko korisnih operacija pretvorbe za rad s drugim vrstama podataka Piton . Ispod su sljedeće operacije pretvorbe koje se pružaju za namedtuples u Pythonu:

  • Korištenje _make()
  • Korištenje _asdict()
  • Korištenje operatora ** (dvostruka zvjezdica).

Pretvorba pomoću _make()

Ova se funkcija koristi za vraćanje a namedtuple() iz iterable prošao kao argument. U ovom primjeru koristimo _make() za pretvaranje popisa 'li' u 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  ))   

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

Operacija pretvorbe pomoću _asdict()

Ova funkcija se vraća the OrderedDict() kako je konstruirano iz mapiranih vrijednosti namedtuple(). U ovom primjeru koristimo _asdict() za pretvaranje ulaznog popisa u instancu 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  ())   

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

Korištenje operatora '**' (dvostruka zvjezdica).

Ova se funkcija koristi za pretvaranje rječnika u namedtuple(). U ovom primjeru koristimo '**' za pretvaranje ulaznog popisa u 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  ))   

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

Dodatne operacije 

Postoje neke dodatne operacije koje su dostupne u Piton za NamedTuples:

  • _polja
  • _zamijeniti()
  • __novi__()
  • __getnewwargs__()

_polja

Ovaj atribut podataka koristi se za dobivanje sva imena ključeva deklariranog imenskog prostora. U ovom primjeru koristimo _fields kako bismo dobili sva deklarirana imena ključeva imenskog prostora.

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  )   

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

_zamijeniti()

_replace() je poput str.replace() ali cilja imenovana polja (ne mijenja izvorne vrijednosti). U ovom primjeru koristimo _replace() za zamjenu imena iz 'Nandini' u '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'  ))   

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

__novi__()

Ova funkcija vraća novu instancu klase Student uzimajući vrijednosti koje želimo dodijeliti ključevima u imenovanoj torki. U ovom primjeru koristimo __new__() za vraćanje nove instance klase 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'  ))   

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

__getnewwargs__()

Ova funkcija vraća imenovanu torku kao običnu torku. U ovom primjeru radimo isto koristeći __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__  ())   

Izlaz
('Himesh' '19' '26082003')  
  1. Promjenjivost : Instance klase mogu biti promjenjive ili nepromjenjive dok namedtuple instance su nepromjenjive.
  2. Metode : Klase mogu sadržavati metode (funkcije) dok namedtuple primarno pruža način pohranjivanja podataka s imenovanim poljima.
  3. Nasljedstvo : Klase podržavaju nasljeđivanje dopuštajući stvaranje složenih hijerarhija dok namedtuple ne podržava nasljeđivanje.

Koja je razlika između typed dict i namedtuple?

  1. Provjera tipa : TypedDict (od typing modul) pruža tipske savjete za rječnike s određenim parovima ključ-vrijednost korisnim za provjeru tipa. namedtuple ne daje tipske savjete.
  2. Promjenjivost : TypedDict instance su promjenjive dopuštajući promjene vrijednosti dok namedtuple instance su nepromjenjive.
  3. Struktura : TypedDict koristi se za definiranje strukture rječnika s određenim tipovima za svaki ključ dok namedtuple pruža imenovana polja za podatke nalik na tuple.