Python поставляется со встроенным модулем, называемым коллекциями , который предоставляет различные классы и функции в качестве альтернативы встроенным в Python структурам данных, таким как dict, list, set и tuple.
В этой статье по Python будет обсуждаться namedtuple, одна из фабричных функций модуля collections. Мы рассмотрим все важные концепции Python namedtuple с примерами и синтаксисом.
Что такое Namedtuple в Python?
Namedtuple — это функция модуля collections в Python, расширения контейнера данных кортежа Python, которая позволяет нам получать доступ к элементам в кортеже, используя имена или метки. Мы можем определить новый класс кортежа, импортировав namedtuple из модуля коллекций Python и используя фабричную функцию namedtuple(). Короче говоря, именованный кортеж представляет собой комбинацию кортежа Python и типа данных dict.
Синтаксис Python Namedtuple
from collections import namedtuple tuple_name = namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
Среди 6 атрибутов namedtuple() только два являются обязательными, typename и fields_name, остальные — необязательными.
Имя типа представляет имя подкласса кортежа и используется для создания объектов, подобных кортежу.
Feild_names атрибут представляет имя метки для элементов кортежа. Это может быть строка, разделенная пробелами «fname lname dept salary» или список строк [‘fname’, ‘lname’, ‘dept’, ‘salary’].
Объявление Namedtuple в Python
Теперь давайте начнем с объявления именованного кортежа.
from collections import namedtuple #Объявление в namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) #Добавление значения в указанном наборе e1 = Employee('Andrey', 'Ex', 'Marketing', 20000) #значение доступа с меткой print("Имя сотрудника e1 is:", e1.fname +" "+ e1.lname) # доступ к значению с использованием значения индекса print("Отдел сотрудника e1 is:", e1[2])
Вывод:
Имя сотрудника e1 is: AndreyEx Отдел сотрудника e1 is: Marketing
Доступ к элементам из Namedtuple в Python
Есть три способа получить доступ к элементам из именованного кортежа, используя:
- индекс (как кортеж)
- имя поля/имя метки (например, словарь)
- метод getattr()
from collections import namedtuple #Объявление в namedtuple: Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) #добавление значения именованного кортежа: e1 = Employee('Andrey', 'Ex', 'Marketing', 20000) # доступ к значению с использованием значения индекса: print("Employee (using index)", e1[0], e1[1], e1[2], e1[3]) # Доступ значения с меткой: print("Employee (using label)", e1.fname, e1.lname, e1.dept, e1.salary) # Доступ значения используя getattr (): print("Employee (using getattr())", getattr(e1,'fname'), getattr(e1,'lname'), getattr(e1,'dept'), getattr(e1,'salary'))
Вывод:
Employee (using index) AndreyEx Marketing 20000 Employee (using label) AndreyEx Marketing 20000 Employee (using getattr()) AndreyEx Marketing 20000
Работа с Python Namedtuple
Именованные кортежи в Python неизменяемы.
Как и обычный кортеж, именованные кортежи также неизменяемы. Это вызовет ошибку, если мы присвоим новое значение существующему номеру индекса или метке.
Пример:
from collections import namedtuple #Объявление в namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) #add значения в указанном наборе e1 = Employee('Andrey', 'Ex', 'Marketing', 20000) e1.fname ="John" # ошибка
Вывод:
AttributeError: невозможно установить атрибут
Преобразование именованного кортежа Python в словарь Python Именованный кортеж рассматривается как словарь, потому что каждый элемент именованного кортежа связан с меткой, как в словаре Python.
Чтобы преобразовать именованный кортеж в словарь, мы можем использовать метод ._asdict().
Пример:
From collections import namedtuple #Объявление в namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) # добавление значения в указанном наборе e1 = Employee('Andrey', 'Ex', 'Marketing', 20000) print(e1._asdict())
Вывод:
{'fname': 'Andrey', 'lname': 'Ex', 'dept': 'Marketing', 'salary': 20000}
Создание Namedtuple из объекта Python Iterable
Чтобы преобразовать итеративный объект, такой как кортеж, список, набор и словарь, в namedtuple, мы можем использовать метод namedtuple ._make () .
Пример:
From collections import namedtuple #Объявление the namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) # список e1 = ['Alex', 'Terminat', 'Marketing', 20000] # кортеж e2 = ('Max', 'Bobikov', 'Marketing', 20000) print(Employee._make(e1)) print(Employee._make(e2))
Вывод:
Employee(fname='Alex', lname='Terminat', dept='Marketing', salary=20000) Employee(fname='Max', lname='Bobikov', dept='Marketing', salary=20000)
Преобразование словаря Python в именованный кортеж
Есть два способа преобразовать словарь Python в именованный кортеж.
Мы можем использовать оператор ** или метод словарных значений().
Пример:
From collections import namedtuple #Объявление the namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) # словарь e1 ={'fname':'Sonia', 'lname':'Jenner', 'dept':'Management', 'salary':20000} # с помощью ** operator print(Employee(**e1)) # с помощью метода ._make() print(Employee._make(e1.values()))
Вывод:
Employee(fname='Sonia', lname='Jenner', dept='Management', salary=20000) Employee(fname='Sonia', lname='Jenner', dept='Management', salary=20000)
Проверить все поля именованного кортежа Python Используя свойство _fields, мы можем все поля именованного кортежа
Пример:
From collections import namedtuple #Объявление namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) print(Employee._fields)
Вывод:
('fname', 'lname', 'dept', 'salary')
Как изменить значение Namedtuple
Именованный набор неизменяем, и мы не можем изменить значения его атрибутов после объявления. Однако namedtuple предоставляет метод .replace (), который возвращает копию namedtuple с измененным значением атрибута.
Пример:
From collections import namedtuple #Объявление в namedtuple Employee = namedtuple("Employee", ['fname', 'lname', 'dept', 'salary']) # добавьте значения в именованный кортеж e1 = Employee('Andrey', 'Ex', 'Marketing', 20000) print(e1._replace(fname='John'))
Вывод:
Employee(fname='John', lname='Ex', dept='Marketing', salary=20000)
Заключение
В заключение этой статьи по Python мы узнали, что называется кортежем в Python и как его объявить. Namedtuple — это комбинация кортежа Python и словаря Python, в котором доступ к элементам осуществляется с помощью как метки (ключа), так и номера индекса. Мы можем использовать namedtuple как обычный контейнер кортежей Python, и они пригодятся, когда мы хотим выполнить хеширование, используя только кортеж.