Namedtuple v Pythonu

Python podpira vrsto vsebniškega slovarja, imenovanega ' namedtuple() 'prisoten v modulu' zbirke '. V tem članku si bomo ogledali, kako ustvariti NameTuple in operacije na NamedTuple.

Kaj je NamedTuple v Pythonu?

notri Python NamedTuple je prisoten znotraj modul zbirk . Zagotavlja način za ustvarjanje preprostih lahkih podatkovnih struktur, podobnih razredu, vendar brez dodatnih stroškov definiranja celotnega razreda. Tako kot slovarji vsebujejo ključe, ki so zgoščeni na določeno vrednost. Nasprotno podpira tako dostop iz para ključ-vrednost kot iteracijo funkcionalnosti, ki slovarji pomanjkanje.

Sintaksa Python NamedTuple

namedtuple(typename field_names)

  • typename – ime namedtuple.
  • field_names – seznam atributov, shranjenih v namedtuple.

primer: Izvedba kode NamedTuple je prikazana v 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  )   

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

Operacije na NamedTuple

Spodaj so naslednje operacije, ki jih je mogoče izvesti z uporabo namedtuple():

  • Ustvarite NameTuple
  • Operacije dostopa
  • Pretvorbene operacije
  • Dodatne operacije

Ustvarite NameTuple v Pythonu

To ustvari nov razred namedtuple s funkcijo namedtuple() iz zbirke modul. Prvi argument je ime novega razreda, drugi argument pa je seznam imen polj.

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

Izhod
1 2  

Operacije dostopa

Imenovane dvojke v Pythonu ponujajo priročne načine za dostop do njihovih polj. Spodaj je nekaj operacij dostopa, ki so na voljo v Pythonu za NamedTuple:

  • Dostop po indeksu
  • Dostop s ključem
  • Dostop z getattr()

Dostop po indeksu

Vrednosti atributa namedtuple() so urejene in do njih je mogoče dostopati s številko indeksa, za razliko od slovarjev, ki niso dostopni z indeksom. V tem primeru dostopamo do študentovega z uporabo 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  ])   

Izhod
The Student age using index is : 19  

Dostop s ključem

Kot v slovarjih je dovoljen tudi dostop po imenu ključa. V tem primeru uporabljamo keyname za dostop do študentovega imena.

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  )   

Izhod
The Student name using keyname is : Nandini  

Dostop z getattr()

To je še en način za dostop do vrednosti tako, da podate namedtuple in vrednost ključa kot njen argument. V tem primeru uporabljamo getattr() za dostop do študentovega ID-ja v dani 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'  ))   

Izhod
The Student DOB using getattr() is : 2541997  

Pretvorbene operacije

Namedtuples zagotavljajo nekaj uporabnih operacij pretvorbe za delo z drugimi tipi podatkov Python . Spodaj so naslednje operacije pretvorbe, ki so na voljo za imenovane dvojke v Pythonu:

  • Uporaba _make()
  • Uporaba _asdict()
  • Uporaba operatorja ** (dvojna zvezdica).

Pretvorba z uporabo _make()

Ta funkcija se uporablja za vrnitev a namedtuple() iz iterable sprejet kot argument. V tem primeru uporabljamo _make() za pretvorbo seznama 'li' v 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  ))   

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

Operacija pretvorbe z uporabo _asdict()

Ta funkcija se vrne the OrderedDict() kot je sestavljen iz preslikanih vrednosti namedtuple(). V tem primeru uporabljamo _asdict() za pretvorbo vhodnega seznama v primerek 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  ())   

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

Uporaba operatorja '**' (dvojna zvezdica).

Ta funkcija se uporablja za pretvorbo slovarja v namedtuple(). V tem primeru uporabljamo '**' za pretvorbo vhodnega seznama v 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  ))   

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

Dodatne operacije 

Obstaja nekaj dodatnih operacij, ki so na voljo v Python za NamedTuples:

  • _polja
  • _replace()
  • __novo__()
  • __getnewwargs__()

_polja

Ta podatkovni atribut se uporablja za pridobivanje vsa ključna imena deklariranega imenskega prostora. V tem primeru uporabljamo _fields, da dobimo deklarirana vsa imena ključev imenskega 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  )   

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

_replace()

_replace() je kot str.replace(), vendar cilja na imenovana polja (ne spreminja izvirnih vrednosti). V tem primeru uporabljamo _replace() za zamenjavo imena iz 'Nandini' v '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'  ))   

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

__novo__()

Ta funkcija vrne nov primerek razreda Student tako, da vzame vrednosti, ki jih želimo dodeliti ključem v imenovani tuple. V tem primeru uporabljamo __new__() za vrnitev novega primerka razreda 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'  ))   

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

__getnewwargs__()

Ta funkcija vrne imenovano torko kot navadno torko. V tem primeru delamo enako z uporabo __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__  ())   

Izhod
('Himesh' '19' '26082003')  
  1. Spremenljivost : Primerki razreda so lahko spremenljivi ali nespremenljivi medtem namedtuple primerki so nespremenljivi.
  2. Metode : Razredi lahko vsebujejo metode (funkcije), medtem ko namedtuple zagotavlja predvsem način za shranjevanje podatkov z poimenovanimi polji.
  3. Dedovanje : Razredi podpirajo dedovanje, ki omogoča ustvarjanje kompleksnih hierarhij, medtem ko namedtuple ne podpira dedovanja.

Kakšna je razlika med typed dict in namedtuple?

  1. Preverjanje tipa : TypedDict (iz typing modul) ponuja tipske namige za slovarje s posebnimi pari ključ-vrednost, uporabnimi za preverjanje tipa. namedtuple ne ponuja tipskih namigov.
  2. Spremenljivost : TypedDict primerki so spremenljivi, kar omogoča spreminjanje vrednosti medtem namedtuple primerki so nespremenljivi.
  3. Struktura : TypedDict se uporablja za definiranje strukture slovarjev s posebnimi tipi za vsak ključ, medtem ko namedtuple ponuja imenovana polja za podatke, podobne tulu.