logo

NamedTuple em Python

Em Python, um tipo 'especial' de tupla é denominado 'tupla nomeada'. Os iniciantes em Python ficam frequentemente perplexos com isso, principalmente quando e por que devemos implementá-lo.

Como um NamedTuple é uma tupla, ele pode executar todas as funções que uma tupla pode. Porém, é mais do que uma simples tupla Python. Em outras linguagens de computador, assim como em C++, é muito mais semelhante a uma 'classe'. É um subtipo de tupla com campos especificados e um comprimento definido construído programaticamente de acordo com nossas especificações. Este tutorial explicará Python NamedTuples e mostrará como usá-los e quando e por que devemos utilizá-los.

O que é uma tupla Python?

Acreditamos que devemos revisitar as tuplas em Python antes de prosseguir.

Uma tupla em Python é um contêiner que pode armazenar muitos valores. Considere o seguinte caso.

Código

 numbers = (34, 32, 56, 24, 75, 24) 

Como podemos ver, usamos parênteses para defini-lo. Índices são usados ​​para acessar elementos. (Lembre-se de que a indexação em Python começa em zero.)

Código

 numbers[1] 

Saída:

 32 

Uma tupla números[1] do Python é separada pelo fato de que não podemos modificar seus elementos, ou seja, os elementos da tupla são imutáveis.

Sintaxe NamedTuple do Python

Devemos primeiro importar um NamedTuple do módulo integrado do Python chamado coleções, conforme mostrado:

 from collections import namedtuple 

A seguir está a sintaxe básica para construir um NamedTuple:

 namedtuple(Name,[Names of Values]) 

Nome é o parâmetro para o título que queremos dar ao nosso NamedTuple, e

[Nomes dos Valores] é um espaço reservado para a lista que contém os nomes dos diferentes valores ou atributos.

Exemplo de NamedTuple em Python

O primeiro passo, como dito anteriormente, é importar o NamedTuple.

 from collections import namedtuple 

Agora podemos usar a sintaxe da parte anterior para construir um NamedTuple:

 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 

Neste exemplo,

mvcjava

Optamos por chamar NamedTuple Student e mencionar os nomes dos valores, 'Nome', 'Classe', 'Idade', 'Assunto' e 'Marcas' em uma lista. E criamos nosso primeiro NamedTuple - Student.

Agora, podemos criar uma casa Student1 com as especificações exigidas usando Student da seguinte forma:

propriedades ácidas em dbms
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Somente os valores ou conteúdos específicos que os rótulos ou campos em nossos [Nomes de Valores] devem conter são obrigatórios.

Para inserir um novo aluno, digamos Aluno2, copie seus valores e cole-os nos campos da nova variável.

 Studnet2 = Student('Arshia', 12, 17, 'Maths', 93) 

Veremos que podemos usar Aluno como um modelo para registrar os novos alunos que quisermos, sem ter que chamar os rótulos dos campos a cada vez.

Como obter os valores de um NamedTuple usando notação de ponto

Podemos usar o método dot para obter os valores das instâncias NamedTuple Student1 e Student2. A seguir está a sintaxe:

 . 

O exemplo de código a seguir demonstra isso:

Código

 print (Student1.Age) print (Student1.Class) print (Student1.Subject) print (Student1.Marks) print (Student1.Name) 

Saída:

 15 11 'English' 79 'Itika' 

Da mesma forma, podemos recuperar as variáveis ​​relacionadas ao NamedTuple Student2 usando Student2.Age, Student2.Class e assim por diante.

Os métodos de acesso de NamedTuple

Podemos recuperar os valores de NamedTuple usando índices, palavras-chave e a função getattr(). Os valores dos campos NamedTuple são estritamente ordenados. Como resultado, podemos usar os índices para encontrá-los.

Os nomes dos campos são convertidos em atributos pelo NamedTuple. Como resultado, getattr() pode ser usado para recuperar dados desse campo.

Código

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #Adding two participants p1 = Participant('Itika', '21', 'India') p2 = Participant('Arshia', '19', 'Australia') #Accessing the items using index print( 'The name and country of the first participant are: ' + p1[0] + ' and ' + p1[2]) #Accessing the items using name of the field print( 'The name and country of the second participant are: ' + p2.Name + ' and ' + p2.Country) #Accessing the items using the method: getattr() print( 'The Age of participant 1 and 2 are: ' + getattr(p1, 'Age') + ' and ' + getattr(p2, 'Age')) 

Saída:

 The name and country of the first participant are: Itika and India The name and country of the second participant are: Arshia and Australia The Age of participant 1 and 2 are: 21 and 19 

Procedimentos de conversão de NamedTuple

Diferentes coleções podem ser convertidas em NamedTuple usando algumas técnicas. Também podemos usar a função _make() para transformar uma lista, tupla ou outros objetos iteráveis ​​em uma instância NamedTuple.

Também podemos converter um objeto de tipo de dados de dicionário em uma coleção NamedTuple. O operativo ** é necessário para esta transformação.

Como um item de tipo de dados OrderedDict, NamedTuple pode gerar itens com suas chaves. Podemos chamar a função _asdict() para convertê-la em um OrderedDict.

Código

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants list_ = ['Itika', '21', 'India'] p1 = Participant._make(list_) print(p1) #Dict to convert Employee dict_ = {'Name':'Arshia', 'Age' : '19', 'Country' : 'Australia'} p2 = Participant(**dict_) print(p2) #Displaying the namedtuple as dictionary participant_dict = p1._asdict() print(participant_dict) 

Saída:

 Participant(Name='Itika', Age='21', Country='India') Participant(Name='Arshia', Age='19', Country='Australia') {'Name': 'Itika', 'Age': '21', 'Country': 'India'} 

Mais operações em NamedTuple

Outros métodos, como _fields() e _replace, estão disponíveis. Podemos determinar quais campos um NamedTuple possui chamando a função _fields(). A função _replace() é usada para trocar um valor por outro.

Código

 import collections #create employee NamedTuple Participant = collections.namedtuple('Participant', ['Name', 'Age', 'Country']) #List to Participants p1 = Participant('Itika', '21', 'India') print(p1) print('The fields of Participant: ' + str(p1._fields)) #updating the country of participant p1 p1 = p1._replace(Country = 'Germany') print(p1) 

Saída:

 Participant(Name='Itika', Age='21', Country='India') The fields of Participant: ('Name', 'Age', 'Country') Participant(Name='Itika', Age='21', Country='Germany') 

Como funciona o NamedTuple do Python?

Vejamos o que mais podemos realizar com um NamedTuple em Python.

1. Um NamedTuple em Python é imutável.

Um NamedTuple em Python não pode ser modificado, assim como sua versão comum. Não podemos alterar suas características.

Tentaremos modificar uma das características de uma tupla com o nome 'Aluno' para demonstrar isso.

Código

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) Student1.Class = 11 

Saída:

 AttributeError Traceback (most recent call last) Input In [41], in () 2 Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) 3 Student1 = Student('Arshia', 12, 17, 'Maths', 93) ----> 4 Student1.Class = 11 AttributeError: can't set attribute 

Como pode ser visto, ele gera um AttributeError. Como resultado, podemos inferir que um NamedTuple é imutável.

2. Criando um dicionário Python a partir de um Python NamedTuple

Em Python, um NamedTuple é semelhante a um dicionário e podemos transformá-lo em um:

Código

 from collections import namedtuple Student = namedtuple('Student',['Name','Class','Age','Subject','Marks']) Student1 = Student('Arshia', 12, 17, 'Maths', 93) print ( Student1._asdict() ) 

Saída:

 {'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93} 

Nós utilizamos o. método asdict() para isso. Isso também produz um OrderedDict do Python.

jogos de mensagens com android

3. NamedTuple com valores padrão

Uma classe de tupla nomeada pode ser configurada com parâmetros padrão da mesma forma que podemos definir valores iniciais para atributos em uma classe regular. Os padrões são atribuídos aos atributos mais à direita, pois os campos com um valor padrão devem aparecer após cada campo sem padrão.

Vamos redefinir a classe Student com apenas 1 entrada padrão.

Código

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1 ) 

Saída:

 Student(Name='Arshia', Class=12, Age=17, Subject='Maths', Marks=100) 

O valor padrão 100 será aplicado para as marcas, que é o campo mais à direita em nossa declaração se criarmos o NamedTuple com apenas um valor.

O valor padrão para Idade será aplicado se especificarmos expressamente que o campo seja Idade?

Código

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') Student1 = Student(Age = 18) print ( Student1 ) 

Saída:

 TypeError: Student.__new__() missing 3 required positional arguments: 'Name', 'Class', and 'Subject' 

A resposta é não. Em um NamedTuple, a ordem dos campos é muito rígida. Mesmo que declaremos algo expressamente, os valores padrão devem ser os mais corretos para evitar ambiguidades e possíveis dificuldades.

Benefícios do Python Namedtuple

Claro, ninguém usará o NamedTuple se não vir nenhuma vantagem. Então, aqui está o que temos:

1. Ao contrário de uma tupla padrão, uma NamedTuple em Python pode recuperar variáveis ​​por seus títulos.

Código

 from collections import namedtuple Student = namedtuple('Student', ['Name','Class','Age','Subject','Marks'], defaults = [100]) Student1 = Student('Arshia', 12, 17, 'Maths') print ( Student1.Age ) 

Saída:

 17 

2. Como não inclui dicionários por instância, Python NamedTuple é eficiente em memória assim como uma tupla convencional. Também é mais rápido que um dicionário por causa disso.

Conclusão

Aprendemos como NamedTuples nos permite combinar os benefícios de tuplas e dicionários, como construir NamedTuples e como usá-los neste tutorial. Como recuperar os valores de NamedTuples usando notação de ponto em Python, como eles funcionam

Se o leitor estiver familiarizado com a POO do Python, verá que ela é idêntica à forma como as classes do Python funcionam. Uma classe e seus atributos atuam como um modelo para a criação de muitos outros objetos ou instâncias, cada um com seu próprio conjunto de valores de atributos.

ponteiro de desreferência c

Para aumentar a clareza do nosso código, no entanto, definir uma classe e fornecer as características essenciais é normalmente excessivo e, em vez disso, é muito mais rápido construir NamedTuples.