logo

NamedTuple in Python

In Python, un tipo 'speciale' di tupla è chiamato 'tupla con nome'. I principianti di Python ne rimangono spesso perplessi, in particolare quando e perché dobbiamo implementarlo.

Poiché una NamedTuple è una tupla, può eseguire tutte le funzioni di una tupla. Tuttavia è più di una semplice tupla Python. In altri linguaggi informatici, proprio come nel C++, è molto più simile a una 'classe'. È un sottotipo di tupla con campi specificati e una lunghezza definita costruita a livello di codice secondo le nostre specifiche. Questo tutorial spiegherà Python NamedTuples e mostrerà come usarli e quando e perché dobbiamo utilizzarli.

Cos'è una tupla Python?

Crediamo che dovremmo rivisitare le tuple in Python prima di procedere.

Una tupla in Python è un contenitore che può memorizzare molti valori. Consideriamo il caso seguente.

Codice

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

Come possiamo vedere, usiamo le parentesi per definirlo. Gli indici vengono utilizzati per accedere agli elementi. (Tieni presente che l'indicizzazione in Python inizia da zero.)

Codice

 numbers[1] 

Produzione:

 32 

Una tupla Python di numeri[1] è separata dal fatto che non possiamo modificare i suoi elementi, ovvero gli elementi della tupla sono immutabili.

Sintassi Python NamedTuple

Dobbiamo prima importare una NamedTuple dal modulo integrato di Python chiamato collezioni, come mostrato:

 from collections import namedtuple 

Quella che segue è la sintassi di base per costruire una NamedTuple:

 namedtuple(Name,[Names of Values]) 

Nome è il parametro per il titolo che vogliamo dare alla nostra NamedTuple, e

[Nomi dei valori] è un segnaposto per l'elenco contenente i nomi dei diversi valori o attributi.

Esempio di NamedTuple in Python

Il primo passo, come detto in precedenza, è importare NamedTuple.

 from collections import namedtuple 

Ora possiamo usare la sintassi della parte precedente per costruire una NamedTuple:

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

In questo esempio,

la scorciatoia tutta maiuscola Excel

Scegliamo di chiamare NamedTuple Student e menzionare i nomi dei valori, 'Nome', 'Classe', 'Età', 'Oggetto' e 'Voti' in un elenco. E abbiamo creato il nostro primo NamedTuple - Student.

Ora possiamo creare una casa Student1 con le specifiche richieste utilizzando Student come segue:

età del dharmendra
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Sono obbligatori solo i valori o i contenuti specifici che le etichette o i campi nei nostri [Nomi dei valori] devono assumere.

Per inserire un nuovo studente, ad esempio Studente2, copia i suoi valori e incollali nei campi della nuova variabile.

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

Vedremo che possiamo usare Student come modello per prendere un registro dei nuovi studenti come vogliamo senza dover richiamare ogni volta le etichette dei campi.

Come ottenere i valori di una NamedTuple utilizzando la notazione punto

Possiamo utilizzare il metodo punto per ottenere i valori delle istanze NamedTuple Student1 e Student2. Quella che segue è la sintassi:

 . 

L'esempio di codice seguente lo dimostra:

Codice

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

Produzione:

 15 11 'English' 79 'Itika' 

Allo stesso modo, possiamo recuperare le variabili relative a NamedTuple Student2 utilizzando Student2.Age, Student2.Class e così via.

I metodi di accesso di NamedTuple

Possiamo recuperare i valori da NamedTuple utilizzando indici, parole chiave e la funzione getattr(). I valori dei campi di NamedTuple sono rigorosamente ordinati. Di conseguenza, potremmo utilizzare gli indici per trovarli.

I nomi dei campi vengono convertiti in attributi da NamedTuple. Di conseguenza, getattr() può essere utilizzato per recuperare i dati da quel campo.

Codice

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

Produzione:

 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 

Procedure di conversione di NamedTuple

Diverse raccolte possono essere convertite in NamedTuple utilizzando alcune tecniche. Possiamo anche usare la funzione _make() per trasformare una lista, una tupla o altri oggetti iterabili in un'istanza NamedTuple.

Possiamo anche convertire un oggetto con tipo di dati dizionario in una raccolta NamedTuple. Per questa trasformazione è richiesto l'operatore **.

Come elemento di tipo dati OrderedDict, NamedTuple può produrre elementi con le sue chiavi. Possiamo chiamare la funzione _asdict() per convertirlo in OrderedDict.

Codice

 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) 

Produzione:

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

Altre operazioni su NamedTuple

Sono disponibili altri metodi, come _fields() e _replace. Possiamo determinare quali campi ha una NamedTuple chiamando la funzione _fields(). La funzione _replace() viene utilizzata per scambiare un valore con un altro.

Codice

 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) 

Produzione:

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

Come funziona NamedTuple di Python?

Diamo un'occhiata a cosa possiamo ottenere in più con NamedTuple in Python.

1. Una NamedTuple in Python è immutabile.

Una NamedTuple in Python non può essere modificata, proprio come la sua versione ordinaria. Non siamo in grado di alterarne le caratteristiche.

Tenteremo di modificare una delle caratteristiche di una tupla del nome 'Student' per dimostrarlo.

Codice

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

Produzione:

 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 

Come si può vedere, genera un AttributeError. Di conseguenza, possiamo dedurre che una NamedTuple è immutabile.

2. Creazione di un dizionario Python da un Python NamedTuple

In Python, una NamedTuple è simile a un dizionario e possiamo trasformarla in uno:

Codice

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

Produzione:

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

Utilizziamo il. metodo asdict() per questo. Questo produce anche un Python OrderedDict.

3. NamedTuple con valori predefiniti

Una classe tupla con nome può essere configurata con parametri predefiniti nello stesso modo in cui possiamo impostare i valori iniziali per gli attributi in una classe normale. I valori predefiniti vengono assegnati agli attributi più a destra poiché i campi con un valore predefinito dovrebbero apparire dopo ogni campo senza valore predefinito.

Ridefiniamo la classe Studente con solo 1 voce predefinita.

Codice

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

Produzione:

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

Per i contrassegni verrà applicata la cifra predefinita 100, che è il campo più a destra nella nostra dichiarazione se creiamo NamedTuple con un solo valore.

Verrà applicato il valore predefinito per l'Età se specifichiamo espressamente che il campo è Età?

Codice

 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 ) 

Produzione:

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

La risposta è no. In una NamedTuple l'ordinamento dei campi è molto rigido. Anche se dichiariamo espressamente qualcosa, i valori predefiniti devono essere quelli più a destra per evitare ambiguità e potenziali difficoltà.

Vantaggi di Python Namedtuple

Naturalmente nessuno utilizzerà NamedTuple se non vede alcun vantaggio. Quindi, ecco cosa abbiamo:

1. A differenza di una tupla standard, una NamedTuple in Python può recuperare le variabili in base ai loro titoli.

Codice

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

Produzione:

 17 

2. Poiché non include dizionari per istanza, Python NamedTuple è efficiente in memoria proprio come una tupla convenzionale. Per questo motivo è anche più veloce di un dizionario.

creazione di elenchi in Java

Conclusione

Abbiamo imparato come NamedTuple ci consentono di combinare i vantaggi di tuple e dizionari, come creare NamedTuple e come usarli in questo tutorial. Come recuperare i valori di NamedTuples utilizzando la notazione punto in Python, come funzionano

Se il lettore ha familiarità con l'OOP di Python, vedrà che è identico a come funzionano le classi Python. Una classe e i suoi attributi fungono da modello per la creazione di molti più oggetti o istanze, ciascuno con il proprio insieme di valori di attributo.

Per aumentare la chiarezza del nostro codice, tuttavia, definire una classe e fornire le caratteristiche essenziali è in genere eccessivo ed è invece molto più veloce costruire NamedTuple.