logo

NamedTuple в Python

В Python „специален“ вид кортеж се нарича „наименуван кортеж“. Начинаещите в Python често са объркани от него, особено кога и защо трябва да го внедрим.

Тъй като NamedTuple е кортеж, той може да изпълнява всички функции, които кортежът може. Това обаче е повече от обикновен кортеж на Python. В други компютърни езици, точно както при C++, той е много по-подобен на „клас“. Това е подтип кортеж с определени полета и дефинирана дължина, изграден програмно според нашите спецификации. Този урок ще обясни Python NamedTuples и ще покаже как да ги използваме и кога и защо трябва да ги използваме.

Какво е Python Tuple?

Вярваме, че трябва да преразгледаме кортежите в Python, преди да продължим.

Кортежът в Python е контейнер, който може да съхранява много стойности. Разгледайте следния случай.

Код

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

Както виждаме, използваме скоби, за да го дефинираме. Индексите се използват за достъп до елементи. (Имайте предвид, че индексирането в Python започва от нула.)

Код

 numbers[1] 

Изход:

 32 

Кортежът numbers[1] Python е отделен от факта, че не можем да модифицираме неговите елементи, т.е. елементите на кортежа са неизменни.

Python NamedTuple Синтаксис

Първо трябва да импортираме NamedTuple от вградения модул на Python, наречен колекции, както е показано:

 from collections import namedtuple 

Следва основният синтаксис за конструиране на NamedTuple:

 namedtuple(Name,[Names of Values]) 

Име това е параметърът за заглавието, което искаме да дадем на нашия NamedTuple, и

[Имена на стойности] е контейнер за списъка, съдържащ имената на различните стойности или атрибути.

Пример за Python NamedTuple

Първата стъпка, както беше казано по-рано, е да импортирате NamedTuple.

 from collections import namedtuple 

Сега можем да използваме синтаксиса от предходната част, за да изградим NamedTuple:

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

В този пример,

unix създаване на директория

Избираме да извикаме NamedTuple Student и да споменем имената на стойностите, „Име“, „Клас“, „Възраст“, ​​„Тема“ и „Оценки“ в списък. И ние създадохме първия си NamedTuple - Student.

Сега можем да създадем къща Student1 с необходимите спецификации, използвайки Student, както следва:

за цикъл в c
 Studnet1 = Student('Itika', 11, 15, 'English', 79) 

Изискват се само конкретните стойности или съдържание, които трябва да приемат етикетите или полетата в нашите [Имена на стойности].

За да направите запис на нов ученик, кажете Student2, копирайте неговите стойности и ги поставете в полетата на новата променлива.

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

Ще видим, че можем да използваме Student като план, за да вземем запис на нови студенти, както искаме, без да се налага всеки път да извикваме етикетите на полетата.

Как да получите стойностите на NamedTuple с помощта на нотация с точка

Можем да използваме метода на точка, за да получим стойностите на NamedTuple екземплярите Student1 и Student2. Синтаксисът е следният:

 . 

Следният примерен код демонстрира това:

Код

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

Изход:

 15 11 'English' 79 'Itika' 

По същия начин можем да извлечем променливите, свързани с NamedTuple Student2, като използваме Student2.Age, Student2.Class и т.н.

Методите за достъп на NamedTuple

Можем да извлечем стойностите от NamedTuple с помощта на индекси, ключови думи и функцията getattr(). Стойностите на полетата на NamedTuple са строго подредени. В резултат на това можем да използваме индексите, за да ги намерим.

Имената на полетата се преобразуват в атрибути от NamedTuple. В резултат на това getattr() може да се използва за извличане на данни от това поле.

Код

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

Изход:

 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 

Процедури за преобразуване на NamedTuple

Различни колекции могат да бъдат преобразувани в NamedTuple с помощта на няколко техники. Можем също да използваме функцията _make(), за да трансформираме списък, кортеж или други итерируеми обекти в екземпляр на NamedTuple.

Можем също така да конвертираме обект от тип данни от речник в колекция NamedTuple. Операцията ** е необходима за тази трансформация.

Като елемент от тип данни OrderedDict, NamedTuple може да дава елементи със своите ключове. Можем да извикаме функцията _asdict(), за да я преобразуваме в OrderedDict.

Код

 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) 

Изход:

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

Още операции на NamedTuple

Налични са и други методи, като _fields() и _replace. Можем да определим кои полета има NamedTuple, като извикаме функцията _fields(). Функцията _replace() се използва за замяна на една стойност с друга.

Код

 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) 

Изход:

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

Как работи NamedTuple на Python?

Нека да разгледаме какво допълнително можем да постигнем с NamedTuple в Python.

1. NamedTuple в Python е неизменен.

NamedTuple в Python не може да бъде модифициран, подобно на обикновената му версия. Ние не можем да променим характеристиките му.

Ще се опитаме да променим една от характеристиките на кортеж с името „Студент“, за да демонстрираме това.

Код

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

Изход:

 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 

Както може да се види, той хвърля AttributeError. В резултат на това можем да заключим, че NamedTuple е неизменен.

2. Създаване на Python речник от Python NamedTuple

В Python NamedTuple е подобен на речник и можем да го трансформираме в такъв чрез:

Код

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

Изход:

линейно търсене в java
 {'Name': 'Arshia', 'Class': 12, 'Age': 17, 'Subject': 'Maths', 'Marks': 93} 

Ние използваме. метод asdict() за това. Това също създава Python OrderedDict.

3. NamedTuple със стойности по подразбиране

Наименуван клас кортеж може да бъде конфигуриран с параметри по подразбиране по същия начин, по който можем да зададем начални стойности за атрибути в обикновен клас. Стойностите по подразбиране се присвояват на най-десните атрибути, тъй като полетата със стойност по подразбиране трябва да се показват след всяко поле без стойност по подразбиране.

Нека предефинираме класа Student само с 1 запис по подразбиране.

Код

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

Изход:

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

Цифрата по подразбиране 100 ще бъде приложена за маркировките, което е най-дясното поле в нашата декларация, ако създадем NamedTuple само с една стойност.

Ще бъде ли приложена стойността по подразбиране за възрастта, ако изрично посочим полето да бъде възрастта?

Код

 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 ) 

Изход:

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

Отговорът е не. В NamedTuple подреждането на полетата е много строго. Дори ако изрично декларираме нещо, стойностите по подразбиране трябва да са най-правилните, за да се предотврати неяснота и потенциални трудности.

Предимства на Python Namedtuple

Разбира се, никой няма да използва NamedTuple, ако не вижда никакви предимства. И така, ето какво имаме:

1. За разлика от стандартния кортеж, NamedTuple в Python може да извлича променливи по техните заглавия.

Код

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

Изход:

 17 

2. Тъй като не включва речници за екземпляр, Python NamedTuple е ефективен в паметта точно като конвенционален кортеж. Поради това е и по-бърз от речник.

функции в c

Заключение

Научихме как NamedTuples ни позволяват да комбинираме предимствата както на кортежи, така и на речници, как да създаваме NamedTuples и как да ги използваме в този урок. Как да извлечем стойностите на NamedTuples с помощта на точкова нотация в Python, как работят

Ако читателят е запознат с ООП на Python, той ще види, че това е идентично с това как функционират класовете на Python. Един клас и неговите атрибути действат като план за създаване на много повече обекти или екземпляри, всеки със собствен набор от стойности на атрибути.

За да увеличим яснотата на нашия код обаче, дефинирането на клас и предоставянето на основните характеристики обикновено е прекомерно и е много по-бързо вместо това да се конструират NamedTuples.