Namedtuple em Python

Python suporta um tipo de dicionário contêiner chamado ' nomeadatupla() 'presente no módulo' coleções '. Neste artigo veremos como criar um NameTuple e operações em NamedTuple.

O que é NamedTuple em Python?

Em Pitão NamedTuple está presente dentro do módulo de coleções . Ele fornece uma maneira de criar estruturas de dados simples e leves, semelhantes a uma classe, mas sem a sobrecarga de definir uma classe completa. Assim como os dicionários, eles contêm chaves com hash para um valor específico. Pelo contrário, suporta acesso por valor-chave e iteração da funcionalidade que dicionários falta.

Sintaxe NamedTuple do Python

nomeadotuple(nome do tipo campos_nomes)

  • typename - O nome da tupla nomeada.
  • field_names - A lista de atributos armazenados no nomeadotuple.

Exemplo: A implementação de código de NamedTuple é mostrada em Pitão .

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  )   

Saída
The Student age using index is : 19 The Student name using keyname is : Nandini  

Operações em NamedTuple

Abaixo estão as seguintes operações que podem ser feitas usando NamedTuple():

  • Crie um NameTuple
  • Operações de acesso
  • Operações de conversão
  • Operações Adicionais

Crie um NameTuple em Python

Isso cria uma nova classenamedtuple usando a funçãonamedtuple() do coleções módulo. O primeiro argumento é o nome da nova classe e o segundo argumento é uma lista de nomes de campos.

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

Saída
1 2  

Operações de acesso

Namedtuples em Python fornecem maneiras convenientes de acessar seus campos. Abaixo estão algumas operações de acesso fornecidas em Python para NamedTuple:

  • Acesso por índice
  • Acesso por nome-chave
  • Acesso usando getattr()

Acesso por índice

Os valores dos atributos de nomeadotuple() são ordenados e podem ser acessados ​​usando o número do índice, diferentemente dos dicionários que não são acessíveis por índice. Neste exemplo estamos acessando o arquivo do aluno usando index.

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

Saída
The Student age using index is : 19  

Acesso por nome-chave

O acesso por nome-chave também é permitido como nos dicionários. Neste exemplo estamos usando keyname para acessar o nome do aluno.

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  )   

Saída
The Student name using keyname is : Nandini  

Acesso usando getattr()

Esta é mais uma maneira de acessar o valor, fornecendo o valor nomeado e a chave como argumento. Neste exemplo, estamos usando getattr() para acessar o id do aluno no nomeadotuple fornecido.

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

Saída
The Student DOB using getattr() is : 2541997  

Operações de conversão

Namedtuples fornecem algumas operações de conversão úteis para trabalhar com outros tipos de dados em Pitão . Abaixo estão as seguintes operações de conversão fornecidas para tuplas nomeadas em Python:

  • Usando _make()
  • Usando _asdict()
  • Usando o operador ** (estrela dupla)

Conversão usando _make()

Esta função é usada para retornar um nomeadotuple() do iterável passado como argumento. Neste exemplo estamos usando _make() para converter a lista 'li' em 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  ))   

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

Operação de conversão usando _asdict()

Esta função retorna o OrdenadoDict() conforme construído a partir dos valores mapeados de nomeadotuple(). Neste exemplo, estamos usando _asdict() para converter a lista de entrada em uma instâncianamedtuple.

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

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

Usando o operador '**' (estrela dupla)

Esta função é usada para converter um dicionário em Nametuple(). Neste exemplo, estamos usando '**' para converter a lista de entrada em 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  ))   

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

Operações Adicionais 

Existem algumas operações adicionais que são fornecidas em Pitão para NamedTuples:

  • _campos
  • _substituir()
  • __novo__()
  • __getnewargs__()

_campos

Este atributo de dados é usado para obter todos os nomes-chave do namespace declarado. Neste exemplo estamos usando _fields para obter todos os nomes-chave do namespace declarado.

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  )   

Saída
All the fields of students are : ('name' 'age' 'DOB')  

_substituir()

_replace() é como str.replace() mas tem como alvo campos nomeados (não modifica os valores originais). Neste exemplo estamos usando _replace() para substituir um nome de 'Nandini' por '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'  ))   

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

__novo__()

Esta função retorna uma nova instância da classe Student tomando os valores que queremos atribuir às chaves na tupla nomeada. Neste exemplo estamos usando __new__() para retornar uma nova instância da 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'  ))   

Saída
Student(name='Himesh' age='19' DOB='26082003')  

__getnewargs__()

Esta função retorna a tupla nomeada como uma tupla simples. Neste exemplo estamos fazendo o mesmo usando __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__  ())   

Saída
('Himesh' '19' '26082003')  
  1. Mutabilidade : As instâncias de uma classe podem ser mutáveis ​​ou imutáveis ​​enquanto namedtuple as instâncias são imutáveis.
  2. Métodos : As classes podem conter métodos (funções) enquanto namedtuple fornece principalmente uma maneira de armazenar dados com campos nomeados.
  3. Herança : As classes suportam herança permitindo a criação de hierarquias complexas enquanto namedtuple não suporta herança.

Qual é a diferença entre dict digitado e nomeadotuple?

  1. Verificação de tipo : TypedDict (do typing módulo) fornece dicas de tipo para dicionários com pares de valores-chave específicos, úteis para verificação de tipo. namedtuple não fornece dicas de tipo.
  2. Mutabilidade : TypedDict instâncias são mutáveis, permitindo alterações nos valores enquanto namedtuple as instâncias são imutáveis.
  3. Estrutura : TypedDict é usado para definir a estrutura de dicionários com tipos específicos para cada chave enquanto namedtuple fornece campos nomeados para dados semelhantes a tuplas.