Collections — это встроенный модуль Python, реализующий специализированный контейнер типов данных. Является альтернативой встроенным контейнерам общего назначения Python, таким как dict, list, set и tuple.
Доступ к данным, хранящимся в обычном кортеже, можно получить с помощью индексов. Пример:
plain_tuple = (10, 11, 12, 13)
plain_tuple[0]
10
plain_tuple[3]
13
Не обязательно давать названия отдельным элементам, хранящимся в кортеже. В этом есть необходимость лишь в том случае, если кортеж обладает множеством полей.
Именно здесь функциональность namedtuple проявляет свои силы. Это функция для кортежей с именованными полями (Named Fields), которую можно рассматривать как расширение встроенного типа данных tuple. Именованные кортежи задают значение для каждой позиции в кортеже, делая код более читаемым и самодокументируемым. Доступ к объектам, хранящимся в кортеже, можно получить с помощью уникального (удобного для чтения) идентификатора. Это избавляет от необходимости запоминать целочисленные индексы. Рассмотрим его реализацию.
from collections import namedtuple
fruit = namedtuple('fruit', 'number variety color')
guava = fruit(number=2, variety='HoneyCrisp', color='green')
apple = fruit(number=5, variety='Granny Smith', color='red')
Построение namedtuple начинается с передачи названия объекта type (fruit). Затем передается строка с пробелами между названиям каждого поля. Теперь можно обращаться к различным параметрам:
fruit
__main__.fruit
guava.number
2
guava.variety
'HoneyCrisp'
apple.color
'red'
Словари — это эффективный способ хранения данных для дальнейшего извлечения, в котором данные представлены в виде неупорядоченного множества пар key:value. Ключи — это уникальные и неизменяемые объекты.
fruits = {'apple':300, 'guava': 200}
fruits['guava']
200
Все очень просто, когда значения представлены целыми числами или строками. Однако если они представлены в форме списков и словарей, значение (пустой список или словарь) нужно инициализировать при первом использовании ключа. defaultdict автоматизирует и упрощает этот процесс. Для лучшего понимания рассмотрим пример ниже:
d = {}
d[1]
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-21-4992413a82b9> in <module> 1 d = {} ----> 2 d[1] KeyError: 1
Словарь Python выдает ошибку, поскольку ‘A’ на данный момент не находится в словаре. Рассмотрим тот же самый пример с использованием defaultdict.
from collections import defaultdict
d = defaultdict(int)
d[1]
0
d
defaultdict(int, {1: 0})
d['1'] = 5
d
defaultdict(int, {1: 0, '1': 5})
d[4]
0
d
defaultdict(int, {1: 0, '1': 5, 4: 0})
d['A']
0
d
defaultdict(int, {1: 0, '1': 5, 4: 0, 'A': 0})
defaultdict создает элементы, для которых нужно получить доступ (если они еще не существуют). defaultdict также является объектом-словарем и содержит те же методы, что и словарь. Разница заключается в том, что он устанавливает первый аргумент (default_factory) в качестве типа данных по умолчанию для словаря.