Использование collections.namedtuple() для создания неизменяемого словаря

Опубликован: 23.01.2024 65

В Python имеется очень полезный встроенный модуль collections, который наделяет стандартные контейнерные типы данных новыми функциями и методами.

Именованные кортежи namedtuple() модуля collections присваивают имя каждому элементу в кортеже и тем самым делают возможным обращение к значению элемента по имени, а не по индексу. Это особенно удобно при большом количестве элементов в кортеже.

По сути, именованные кортежи создают неизменяемый словарь, только более удобный и легко читаемый.

Синтаксис: ntuple = collections.namedtuple(typename, field_names [, ...])

  • typename - имя именованного кортежа;
  • field_names - имена элементов кортежа (это может быть последовательность строк, разделенных пробелом, или список строк).
from collections import namedtuple

# создание именованного кортежа michail
Person = namedtuple("Person", "name age height")
michail = Person("Michail", 35, 1.75)
michail.age
35

# создание двух именованных кортежей apple и orange
fruit = namedtuple('fruit', 'number sort color')
apple = fruit(number=3, sort='Семеринка', color='зеленый')
orange = fruit(number=5, sort='Сумо', color='оранжевый')

# получение значений элементов кортежей через их имена
apple.sort
'Семеринка'

orange.color
'оранжевый'

Получение значения элемента в именованном кортеже осуществляется не по индексу, а по именам полей через точку .: имя_кортежа.имя_поля

Такой синтаксис понятнее, легко читается и снижает вероятность ошибок.

В остальном именованные кортежи обладают всеми свойствами и методами простых кортежей, в том числе быстродействием и неизменяемостью.

В общем, если нужна неизменяемая структура данных для правильного решения задачи, то лучше использовать именованный кортеж вместо словаря.

Похожие посты

Преимущества двухсторонней очереди collections.deque() над списком

Преимущества использования словаря collections.defaultdict()

Количество одинаковых элементов в списке (кортеже) или строке

Методы преобразования списка в строку и обратно

Комментариев нет.