logo

NamedTuple în Python

În Python, un tip „special” de tuplu este numit „tuplu numit”. Începătorii Python sunt adesea perplexi de el, în special când și de ce trebuie să îl implementăm.

Deoarece un NamedTuple este un tuplu, acesta poate îndeplini toate funcțiile pe care le poate face un tuplu. Este, totuși, mai mult decât un simplu tuplu Python. În alte limbaje de calculator, la fel ca și în cazul C++, este mult mai asemănător cu o „clasă”. Este un subtip de tuplu cu câmpuri specificate și o lungime definită construită programatic conform specificațiilor noastre. Acest tutorial va explica Python NamedTuples și va arăta cum să le folosim și când și de ce trebuie să le folosim.

Ce este un tuplu Python?

Credem că ar trebui să revizuim tuplele din Python înainte de a continua.

Un tuplu în Python este un container care poate stoca multe valori. Luați în considerare următorul caz.

Cod

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

După cum putem vedea, folosim parantezele pentru a-l defini. Indecșii sunt utilizați pentru a accesa elemente. (Rețineți că indexarea în Python începe de la zero.)

Cod

 numbers[1] 

Ieșire:

 32 

Un tuplu Python numere[1] este separat de faptul că nu îi putem modifica elementele, adică elementele tuplului sunt imuabile.

Sintaxa Python NamedTuple

Mai întâi trebuie să importam un NamedTuple din modulul încorporat al lui Python numit colecții, după cum se arată:

 from collections import namedtuple 

Următoarea este sintaxa de bază pentru construirea unui NamedTuple:

 namedtuple(Name,[Names of Values]) 

Nume este parametrul pentru titlul pe care vrem să-l dăm NamedTuple și

[Numele valorilor] este un substituent pentru lista care conține numele diferitelor valori sau atribute.

Exemplu Python NamedTuple

Primul pas, după cum s-a spus anterior, este să importați NamedTuple.

 from collections import namedtuple 

Acum putem folosi sintaxa din partea anterioară pentru a construi un NamedTuple:

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

În acest exemplu,

cât cântărește kat timpf

Alegem să apelăm Studentul NamedTuple și să menționăm într-o listă numele valorilor, „Nume”, „Clasă”, „Vârsta”, „Subiect” și „Marke”. Și am creat primul nostru NamedTuple - Student.

Acum, putem crea o casă Student1 cu specificațiile necesare folosind Student după cum urmează:

vârsta dharmendra
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Sunt obligatorii doar valorile sau conținutul specific pe care trebuie să le ia etichetele sau câmpurile din [Numele valorilor] noastre.

Pentru a face o intrare a unui nou student, să spunem Student2, copiați valorile acestuia și lipiți-le în câmpurile noii variabile.

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

Vom vedea că putem folosi Student ca plan pentru a înregistra noii studenți după cum dorim, fără a fi nevoie să strigăm etichetele câmpurilor de fiecare dată.

Cum să obțineți valorile unui NamedTuple folosind notația punct

Putem folosi metoda punctului pentru a obține valorile instanțelor NamedTuple Student1 și Student2. Următoarea este sintaxa:

 . 

Următorul exemplu de cod demonstrează acest lucru:

Cod

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

Ieșire:

 15 11 'English' 79 'Itika' 

De asemenea, putem prelua variabilele legate de NamedTuple Student2 folosind Student2.Age, Student2.Class și așa mai departe.

Metodele de acces la NamedTuple

Putem prelua valorile din NamedTuple folosind indici, cuvinte cheie și funcția getattr(). Valorile câmpurilor lui NamedTuple sunt strict ordonate. Ca rezultat, putem folosi indicii pentru a le găsi.

Numele câmpurilor sunt convertite în atribute de către NamedTuple. Ca rezultat, getattr() poate fi folosit pentru a prelua date din acel câmp.

Cod

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

Ieșire:

 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 

Proceduri de conversie pentru NamedTuple

Diferite colecții pot fi convertite în NamedTuple folosind câteva tehnici. De asemenea, putem folosi funcția _make() pentru a transforma o listă, un tuplu sau alte obiecte iterabile într-o instanță NamedTuple.

De asemenea, putem converti un obiect tip de date dicționar într-o colecție NamedTuple. Operativul ** este necesar pentru această transformare.

Ca element de tip de date OrderedDict, NamedTuple poate genera elemente cu cheile sale. Putem apela funcția _asdict() pentru a o converti într-un OrderedDict.

Cod

 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) 

Ieșire:

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

Mai multe operațiuni pe NamedTuple

Alte metode, cum ar fi _fields() și _replace, sunt disponibile. Putem determina ce câmpuri are un NamedTuple apelând funcția _fields(). Funcția _replace() este folosită pentru a schimba o valoare cu alta.

Cod

 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) 

Ieșire:

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

Cum funcționează NamedTuple din Python?

Să ne uităm la ce plus putem realiza cu un NamedTuple în Python.

1. Un NamedTuple în Python este imuabil.

Un NamedTuple în Python nu poate fi modificat, la fel ca versiunea sa obișnuită. Nu putem să îi modificăm caracteristicile.

Vom încerca să modificăm una dintre caracteristicile unui tuplu al numelui „Student” pentru a demonstra acest lucru.

Cod

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

Ieșire:

 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 

După cum se poate vedea, aruncă un AttributeError. Ca rezultat, putem deduce că un NamedTuple este imuabil.

2. Crearea unui dicționar Python dintr-un Python NamedTuple

În Python, un NamedTuple este similar cu un dicționar și îl putem transforma într-unul prin:

Cod

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

Ieșire:

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

Noi folosim. metoda asdict() pentru aceasta. Acest lucru produce, de asemenea, un Python OrderedDict.

3. NamedTuple cu valori implicite

O clasă de tuplu numită poate fi configurată cu parametri impliciti în același mod în care putem seta valori inițiale pentru atributele dintr-o clasă obișnuită. Valorile implicite sunt atribuite atributelor din dreapta, deoarece câmpurile care au o valoare implicită ar trebui să apară după fiecare câmp fără o valoare implicită.

Să redefinim clasa Student cu doar o intrare implicită.

Cod

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

Ieșire:

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

Cifra implicită 100 va fi aplicată pentru mărci, care este câmpul din dreapta din declarația noastră dacă creăm NamedTuple cu o singură valoare.

Se va aplica valoarea implicită pentru Vârstă dacă specificăm în mod expres câmpul să fie Vârsta?

Cod

 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 ) 

Ieșire:

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

Raspunsul este nu. Într-un NamedTuple, ordonarea câmpurilor este foarte rigidă. Chiar dacă declarăm în mod expres ceva, valorile implicite trebuie să fie cele mai potrivite pentru a preveni ambiguitatea și potențialele dificultăți.

Beneficiile Python Namedtuple

Desigur, nimeni nu va folosi NamedTuple dacă nu vede niciun avantaj. Deci, iată ce avem:

1. Spre deosebire de un tuplu standard, un NamedTuple din Python poate prelua variabile după titlurile lor.

Cod

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

Ieșire:

 17 

2. Deoarece nu include dicționare per-instanță, Python NamedTuple este eficient în memorie la fel ca un tuplu convențional. De asemenea, este mai rapid decât un dicționar din această cauză.

Concluzie

Am învățat cum NamedTuples ne permit să combinăm beneficiile ambelor tupluri și dicționare, cum să construim NamedTuples și cum să le folosim în acest tutorial. Cum se recuperează valorile NamedTuples folosind notația punct în Python, cum funcționează acestea

Dacă cititorul este familiarizat cu OOP-ul Python, va vedea că acesta este identic cu modul în care funcționează clasele Python. O clasă și atributele sale acționează ca un model pentru crearea multor mai multe obiecte sau instanțe, fiecare cu propriul set de valori ale atributelor.

Cu toate acestea, pentru a crește claritatea codului nostru, definirea unei clase și furnizarea caracteristicilor esențiale este de obicei excesivă și este mult mai rapid să construiți NamedTuples.