Namedtuple в Python

Python поддържа тип контейнерен речник, наречен ' namedtuple() " присъства в модула " колекции '. В тази статия ще видим как да създадете NameTuple и операции с NamedTuple.

Какво е NamedTuple в Python?

в Python NamedTuple присъства вътре в модул колекции . Той предоставя начин за създаване на прости леки структури от данни, подобни на клас, но без допълнителни разходи за дефиниране на пълен клас. Подобно на речниците, те съдържат ключове, които са хеширани до определена стойност. Напротив, той поддържа както достъп от ключ-стойност, така и итерация на функционалността, която речници липса.

Python NamedTuple Синтаксис

namedtuple(typename field_names)

  • typename - Името на namedtuple.
  • field_names - Списъкът с атрибути, съхранени в namedtuple.

Пример: Реализацията на код на NamedTuple е показана в 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  )   

Изход
The Student age using index is : 19 The Student name using keyname is : Nandini  

Операции върху NamedTuple

По-долу са следните операции, които могат да се извършват с помощта на namedtuple():

  • Създайте NameTuple
  • Операции за достъп
  • Операции за преобразуване
  • Допълнителни операции

Създайте NameTuple в Python

Това създава нов клас namedtuple, използвайки функцията namedtuple() от колекции модул. Първият аргумент е името на новия клас, а вторият аргумент е списък с имена на полета.

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

Изход
1 2  

Операции за достъп

Namedtuples в Python предоставят удобни начини за достъп до техните полета. По-долу са някои операции за достъп, предоставени в Python за NamedTuple:

  • Достъп по индекс
  • Достъп чрез име на ключ
  • Достъп чрез getattr()

Достъп по индекс

Стойностите на атрибутите на 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 index   print  (  'The Student age using index is : '     end  =  ''  )   print  (  S  [  1  ])   

Изход
The Student age using index is : 19  

Достъп чрез име на ключ

Достъпът чрез име на ключ също е разрешен, както в речниците. В този пример използваме keyname за достъп до името на ученика.

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  )   

Изход
The Student name using keyname is : Nandini  

Достъп чрез getattr()

Това е още един начин за достъп до стойността, като зададете namedtuple и ключова стойност като неин аргумент. В този пример използваме getattr() за достъп до идентификатора на ученика в дадения 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'  ))   

Изход
The Student DOB using getattr() is : 2541997  

Операции за преобразуване

Namedtuples предоставят няколко полезни операции за преобразуване за работа с други типове данни Python . По-долу са следните операции за преобразуване, които се предоставят за namedtuples в Python:

  • Използване на _make()
  • Използване на _asdict()
  • Използване на оператор ** (двойна звезда).

Преобразуване чрез _make()

Тази функция се използва за връщане на a namedtuple() от итерируемия премина като аргумент. В този пример използваме _make(), за да преобразуваме списъка 'li' в 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  ))   

Изход
The namedtuple instance using iterable is : Student(name='Manjeet' age='19' DOB='411997')  

Операция за преобразуване с помощта на _asdict()

Тази функция се връща на OrderedDict() както е конструирано от картографираните стойности на namedtuple(). В този пример използваме _asdict() за преобразуване на входния списък в инстанция 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  ())   

Изход
The OrderedDict instance using namedtuple is : OrderedDict([('name' 'Nandini') ('age' '19') ('DOB' '2541997')])  

Използване на оператор "**" (двойна звезда).

Тази функция се използва за преобразуване на речник в namedtuple(). В този пример използваме '**', за да преобразуваме входния списък в 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  ))   

Изход
The namedtuple instance from dict is : Student(name='Nikhil' age=19 DOB='1391997')  

Допълнителни операции 

Има някои допълнителни операции, които са предвидени в Python за NamedTuples:

  • _полета
  • _replace()
  • __ново__()
  • __getnewargs__()

_полета

Този атрибут на данни се използва за получаване всички ключови имена от декларираното пространство от имена. В този пример използваме _fields, за да получим всички декларирани ключови имена на пространството от имена.

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  )   

Изход
All the fields of students are : ('name' 'age' 'DOB')  

_replace()

_replace() е като str.replace(), но се насочва към именувани полета (не променя оригиналните стойности). В този пример използваме _replace(), за да заменим име от „Nandini“ на „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'  ))   

Изход
returns a new namedtuple : Student(name='Manjeet' age='19' DOB='2541997')  

__ново__()

Тази функция връща нов екземпляр на класа Student, като взема стойностите, които искаме да присвоим на ключовете в посочения кортеж. В този пример използваме __new__(), за да върнем нов екземпляр на класа 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'  ))   

Изход
Student(name='Himesh' age='19' DOB='26082003')  

__getnewargs__()

Тази функция връща посочения кортеж като обикновен кортеж. В този пример правим същото, като използваме __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__  ())   

Изход
('Himesh' '19' '26082003')  
  1. Изменчивост : Екземплярите на клас могат да бъдат променливи или неизменни докато namedtuple екземплярите са неизменни.
  2. Методи : Класовете могат да съдържат методи (функции), докато namedtuple основно предоставя начин за съхраняване на данни с именувани полета.
  3. Наследство : Класовете поддържат наследяване, което позволява създаването на сложни йерархии, докато namedtuple не поддържа наследяване.

Каква е разликата между typed dict и namedtuple?

  1. Проверка на типа : TypedDict (от typing модул) предоставя подсказки за тип за речници със специфични двойки ключ-стойност, полезни за проверка на тип. namedtuple не предоставя съвети за тип.
  2. Изменчивост : TypedDict екземплярите са променливи, позволявайки промени в стойностите while namedtuple екземплярите са неизменни.
  3. Структура : TypedDict се използва за дефиниране на структурата на речници със специфични типове за всеки ключ, докато namedtuple предоставя наименувани полета за подобни на кортежи данни.