Namedtuple v Pythonu

Python podporuje typ kontejnerového slovníku s názvem ' Namedtuple() 'přítomný v modulu' sbírky '. V tomto článku se podíváme na to, jak vytvořit NameTuple a operace na NamedTuple.

Co je NamedTuple v Pythonu?

V Krajta NamedTuple je přítomen uvnitř modul sbírek . Poskytuje způsob, jak vytvořit jednoduché odlehčené datové struktury podobné třídě, ale bez režie definování celé třídy. Stejně jako slovníky obsahují klíče, které jsou hashovány na konkrétní hodnotu. Naopak podporuje jak přístup z páru klíč-hodnota, tak iteraci funkcí, které slovníky nedostatek.

Syntaxe Pythonu NamedTuple

namedtuple(název typu název_pole)

  • typename – Název pojmenované množiny.
  • field_names - Seznam atributů uložených v namedtuple.

Příklad: Implementace kódu NamedTuple je zobrazena v Krajta .

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  )   

Výstup
The Student age using index is : 19 The Student name using keyname is : Nandini  

Operace na NamedTuple

Níže jsou uvedeny následující operace, které lze provést pomocí Namedtuple():

  • Vytvořte NameTuple
  • Přístupové operace
  • Konverzní operace
  • Další operace

Vytvořte NameTuple v Pythonu

Tím se vytvoří nová třída namedtuple pomocí funkce namedtuple() z sbírky modul. První argument je název nové třídy a druhý argument je seznam názvů polí.

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

Výstup
1 2  

Přístupové operace

Namedtuple v Pythonu poskytují pohodlné způsoby přístupu k jejich polím. Níže jsou uvedeny některé operace přístupu poskytované v Pythonu pro NamedTuple:

  • Přístup podle indexu
  • Přístup pomocí názvu klíče
  • Přístup pomocí getattr()

Přístup podle indexu

Hodnoty atributů namedtuple() jsou seřazeny a lze k nim přistupovat pomocí čísla indexu na rozdíl od slovníků, které nejsou přístupné pomocí indexu. V tomto příkladu přistupujeme ke studentovi pomocí indexu.

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

Výstup
The Student age using index is : 19  

Přístup pomocí názvu klíče

Přístup podle názvu klíče je také povolen jako ve slovnících. V tomto příkladu používáme keyname pro přístup ke jménu studenta.

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  )   

Výstup
The Student name using keyname is : Nandini  

Přístup pomocí getattr()

Toto je další způsob, jak získat přístup k hodnotě tím, že jako argument uvedete nametuple a hodnotu klíče. V tomto příkladu používáme getattr() pro přístup k id studenta v daném nametuple.

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

Výstup
The Student DOB using getattr() is : 2541997  

Konverzní operace

Namedtuple poskytují několik užitečných převodních operací pro práci s jinými datovými typy Krajta . Níže jsou uvedeny následující převodní operace, které jsou k dispozici pro namedtuples v Pythonu:

  • Použití _make()
  • Použití _asdict()
  • Použití operátoru ** (dvojitá hvězdička).

Konverze pomocí _make()

Tato funkce se používá k návratu a namedtuple() z iterable prošlo jako argument. V tomto příkladu používáme _make() k převodu seznamu 'li' na 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  ))   

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

Konverzní operace pomocí _asdict()

Tato funkce se vrací a OrderedDict() jak je vytvořeno z mapovaných hodnot namedtuple(). V tomto příkladu používáme _asdict() k převodu vstupního seznamu do instance 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  ())   

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

Použití operátoru '**' (dvojitá hvězdička).

Tato funkce se používá k převodu slovníku na namedtuple(). V tomto příkladu používáme '**' k převodu vstupního seznamu na 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  ))   

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

Další operace 

Existují některé další operace, které jsou poskytovány v Krajta pro NamedTuples:

  • _pole
  • _nahradit()
  • __nový__()
  • __getnewargs__()

_pole

Tento atribut dat se používá k získání všechna klíčová jména deklarovaného jmenného prostoru. V tomto příkladu používáme _fields k získání všech názvů klíčů deklarovaného jmenného prostoru.

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  )   

Výstup
All the fields of students are : ('name' 'age' 'DOB')  

_nahradit()

_replace() je jako str.replace(), ale cílí na pojmenovaná pole( nemění původní hodnoty). V tomto příkladu používáme _replace() k nahrazení názvu z 'Nandini' na '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'  ))   

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

__nový__()

Tato funkce vrací novou instanci třídy Student převzetím hodnot, které chceme přiřadit klíčům v pojmenované n-tice. V tomto příkladu používáme __new__() k vrácení nové instance třídy 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'  ))   

Výstup
Student(name='Himesh' age='19' DOB='26082003')  

__getnewargs__()

Tato funkce vrátí pojmenovanou n-tice jako obyčejnou n-tici. V tomto příkladu děláme totéž pomocí __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__  ())   

Výstup
('Himesh' '19' '26082003')  
  1. Proměnlivost : Instance třídy mohou být proměnlivé nebo neměnné while namedtuple instance jsou neměnné.
  2. Metody : Třídy mohou obsahovat metody (funkce) while namedtuple primárně poskytuje způsob ukládání dat s pojmenovanými poli.
  3. Dědictví : Třídy podporují dědičnost umožňující vytváření složitých hierarchií namedtuple nepodporuje dědičnost.

Jaký je rozdíl mezi typed dict a namedtuple?

  1. Kontrola typu : TypedDict (z typing modul) poskytuje typové rady pro slovníky se specifickými páry klíč-hodnota užitečné pro kontrolu typu. namedtuple neposkytuje typové rady.
  2. Proměnlivost : TypedDict instance jsou proměnlivé a umožňují změny hodnot while namedtuple instance jsou neměnné.
  3. Struktura : TypedDict se používá k definování struktury slovníků se specifickými typy pro každý klíč namedtuple poskytuje pojmenovaná pole pro data podobná n-tice.