logo

NamedTuple in Python

In Python wordt een 'speciaal' soort tuple 'named tuple' genoemd. Beginners in Python staan ​​er vaak versteld van, vooral wanneer en waarom we het moeten implementeren.

Omdat een NamedTuple een tuple is, kan deze alle functies uitvoeren die een tuple ook kan. Het is echter meer dan een simpele Python-tuple. In andere computertalen lijkt het, net als bij C++, veel meer op een 'klasse'. Het is een subtype van tupel met gespecificeerde velden en een gedefinieerde lengte die programmatisch volgens onze specificaties is gebouwd. Deze tutorial legt Python NamedTuples uit en laat zien hoe je ze kunt gebruiken en wanneer en waarom we ze moeten gebruiken.

Wat is een Python-tupel?

We zijn van mening dat we tupels in Python opnieuw moeten bekijken voordat we verder gaan.

Een tupel in Python is een container waarin veel waarden kunnen worden opgeslagen. Beschouw het volgende geval.

Code

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

Zoals we kunnen zien, gebruiken we haakjes om het te definiëren. Indexen worden gebruikt om toegang te krijgen tot elementen. (Houd er rekening mee dat indexering in Python bij nul begint.)

Code

 numbers[1] 

Uitgang:

 32 

Een Python-tupel met getallen[1] wordt gescheiden door het feit dat we de elementen ervan niet kunnen wijzigen, dat wil zeggen dat elementen van het tupel onveranderlijk zijn.

Python NamedTuple-syntaxis

We moeten eerst een NamedTuple importeren uit de ingebouwde module van Python, genaamd collections, zoals weergegeven:

 from collections import namedtuple 

Het volgende is de basissyntaxis voor het construeren van een NamedTuple:

 namedtuple(Name,[Names of Values]) 

Naam het is de parameter voor de titel die we onze NamedTuple willen geven, en

[Namen van waarden] is een tijdelijke aanduiding voor de lijst met de namen van de verschillende waarden of attributen.

Python NamedTuple-voorbeeld

De eerste stap is, zoals eerder gezegd, het importeren van NamedTuple.

 from collections import namedtuple 

Nu kunnen we de syntaxis uit het voorgaande deel gebruiken om een ​​NamedTuple te bouwen:

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

In dit voorbeeld

c++ converteert in naar string

We kiezen ervoor om de NamedTuple Student aan te roepen en de namen van de waarden, 'Name', 'Class', 'Age', 'Subject' en 'Marks' in een lijst te vermelden. En we hebben onze eerste NamedTuple - Student gemaakt.

Nu kunnen we met Student als volgt een huis Student1 met de vereiste specificaties maken:

als het anders bashen is
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Alleen de specifieke waarden of inhoud die de labels of velden in onze [Namen van waarden] moeten bevatten, zijn vereist.

Om een ​​nieuwe leerling in te voeren, bijvoorbeeld Student2, kopieert u de waarden ervan en plakt u deze in de velden van de nieuwe variabele.

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

We zullen zien dat we Student als blauwdruk kunnen gebruiken om een ​​record van nieuwe studenten op te nemen zoals we willen, zonder elke keer de labels van de velden te hoeven oproepen.

Hoe u de waarden van een benoemde tuple kunt verkrijgen met behulp van puntnotatie

We kunnen de dot-methode gebruiken om de waarden van de NamedTuple-instanties Student1 en Student2 te verkrijgen. Het volgende is de syntaxis:

 . 

Het volgende codevoorbeeld laat dit zien:

Code

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

Uitgang:

 15 11 'English' 79 'Itika' 

Op dezelfde manier kunnen we de variabelen gerelateerd aan de NamedTuple Student2 ophalen met behulp van Student2.Age, Student2.Class, enzovoort.

De toegangsmethoden van NamedTuple

We kunnen de waarden van NamedTuple ophalen met behulp van indices, trefwoorden en de functie getattr(). De veldwaarden van NamedTuple zijn strikt geordend. Als gevolg hiervan kunnen we de indices gebruiken om ze te vinden.

De veldnamen worden door de NamedTuple geconverteerd naar attributen. Als gevolg hiervan kan getattr() worden gebruikt om gegevens uit dat veld op te halen.

Code

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

Uitgang:

 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 

Conversieprocedures van NamedTuple

Verschillende collecties kunnen met behulp van een aantal technieken naar NamedTuple worden geconverteerd. We kunnen ook de functie _make() gebruiken om een ​​lijst, tuple of andere iterabele objecten om te zetten in een NamedTuple-instantie.

We kunnen ook een woordenboekgegevenstypeobject converteren naar een NamedTuple-verzameling. Voor deze transformatie is de **-agent nodig.

Als een OrderedDict-datatype-item kan NamedTuple items opleveren met zijn sleutels. We kunnen de functie _asdict() aanroepen om deze naar een OrderedDict te converteren.

Code

 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) 

Uitgang:

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

Meer bewerkingen op NamedTuple

Andere methoden, zoals _fields() en _replace, zijn beschikbaar. We kunnen bepalen welke velden een NamedTuple heeft door de functie _fields() aan te roepen. De functie _replace() wordt gebruikt om de ene waarde voor de andere te verwisselen.

Code

ronde wiskunde Java
 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) 

Uitgang:

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

Hoe werkt NamedTuple van Python?

Laten we eens kijken wat we extra kunnen bereiken met een NamedTuple in Python.

1. Een NamedTuple in Python is onveranderlijk.

Een NamedTuple in Python kan niet worden gewijzigd, net als de gewone versie. We kunnen de kenmerken ervan niet veranderen.

We zullen proberen een van de kenmerken van een tupel met de naam 'Student' te wijzigen om dit aan te tonen.

Code

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

Uitgang:

 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 

Zoals u kunt zien, genereert het een AttributeError. Als gevolg hiervan kunnen we concluderen dat een NamedTuple onveranderlijk is.

2. Een Python-woordenboek maken op basis van een Python NamedTuple

In Python lijkt een NamedTuple op een woordenboek, en we kunnen er een woordenboek van maken door:

Code

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

Uitgang:

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

Wij maken gebruik van de. asdict() methode hiervoor. Dit levert ook een Python OrderedDict op.

3. NamedTuple met standaardwaarden

Een benoemde tuple-klasse kan worden geconfigureerd met standaardparameters op dezelfde manier waarop we initiële waarden kunnen instellen voor attributen in een reguliere klasse. De standaardwaarden worden toegewezen aan de meest rechtse attributen, omdat velden met een standaardwaarde na elk veld zonder standaardwaarde moeten verschijnen.

Laten we de klasse Student opnieuw definiëren met slechts één standaardinvoer.

Code

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

Uitgang:

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

Het standaardcijfer 100 wordt toegepast op de markeringen, wat het meest rechtse veld in onze declaratie is als we de NamedTuple met slechts één waarde maken.

Zal de standaardwaarde voor de Leeftijd worden toegepast als we uitdrukkelijk opgeven dat het veld de Leeftijd is?

Code

 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 ) 

Uitgang:

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

Het antwoord is nee. In een NamedTuple is de volgorde van de velden erg rigide. Zelfs als we iets uitdrukkelijk declareren, moeten de standaardwaarden de meest rechtse zijn om dubbelzinnigheid en potentiële problemen te voorkomen.

Voordelen van Python Namedtuple

Natuurlijk zal niemand NamedTuple gebruiken als hij er geen voordelen in ziet. Dus dit is wat we hebben:

abs c-code

1. In tegenstelling tot een standaard tupel kan een NamedTuple in Python variabelen ophalen op basis van hun titels.

Code

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

Uitgang:

 17 

2. Omdat het geen woordenboeken per exemplaar bevat, is Python NamedTuple net zo efficiënt in het geheugen als een conventionele tupel. Hierdoor is het ook sneller dan een woordenboek.

Conclusie

In deze tutorial hebben we geleerd hoe NamedTuples ons in staat stellen de voordelen van zowel tuples als woordenboeken te combineren, hoe NamedTuples kunnen worden gebouwd en hoe we ze kunnen gebruiken. Hoe de waarden van NamedTuples op te halen met behulp van puntnotatie in Python, hoe ze werken

Als de lezer bekend is met Python's OOP, zal hij zien dat dit identiek is aan hoe Python-klassen functioneren. Een klasse en zijn attributen fungeren als blauwdruk voor het creëren van veel meer objecten of instanties, elk met zijn eigen set attribuutwaarden.

Om de duidelijkheid van onze code te vergroten is het echter doorgaans overdreven om een ​​klasse te definiëren en de essentiële kenmerken aan te bieden, en in plaats daarvan is het veel sneller om NamedTuples te construeren.