Модуль collections предоставляет специализированные контейнеры-датаклассы, которые являются альтернативой стандартным контейнерам, таким как dict, list, set, и tuple.

Классы

deque

Класс deque(iterable, maxlen[, flags]) реализует двусторонние очереди (deque — double-ended queues) — это контейнеры, похожие на списки, которые поддерживают операции добавления и удаления по обеим сторонам с постоянной сложностью O(1). Новые очереди создаются с использованием следующих аргументов:

  • iterable должен быть пустым кортежем, и новая очередь создается пустой.
  • maxlen должен быть указан, и очередь будет ограничена этой максимальной длиной. После заполнения очереди любые новые добавляемые элементы будут вытеснять элементы с противоположного конца.
  • Необязательный flags может быть равен 1 для проверки переполнения при добавлении элементов.

Помимо поддержки методов bool и len, объекты deque обладают следующими методами:

Метод append(x) добавляет x в правую часть очереди. Вызывает IndexError, если проверка переполнения включена и в очереди больше нет места.

Метод appendleft(x) добавляет x в левую сторону очереди. Вызывает IndexError, если проверка переполнения включена и в очереди больше нет места.

Метод pop() удаляет и возвращает элемент из правой части очереди. Вызывает IndexError, если элементов нет.

Метод popleft() удаляет и возвращает элемент из левой части очереди. Вызывает IndexError, если элементов нет.

Метод extend(iterable) расширяет очередь, добавляя все элементы из iterable в правую часть очереди. Вызывает IndexError, если проверка переполнения включена и в очереди больше нет места.

  from collections import deque

dq = deque((), maxlen=3)

dq.append(1)
dq.append(2)
dq.append(3)

print(dq)  # вывод: deque([1, 2, 3])

dq.append(4)
print(dq)  # вывод: deque([2, 3, 4]) - так как длина ограничена, 1 удален

dq.appendleft(0)
print(dq)  # вывод: deque([0, 2, 3]) - 4 удален
  

OrderedDict

Класс OrderedDict(...) реализует подкласс типа dict, который запоминает и сохраняет порядок добавления ключей. При итерации по упорядоченному словарю ключи/элементы возвращаются в порядке их добавления:

  from collections import OrderedDict

# Для достижения выгоды от упорядоченных ключей, OrderedDict должен быть инициализирован
# от последовательности пар (ключ, значение).
d = OrderedDict([("z", 1), ("a", 2)])
# Больше элементов может быть добавлено как обычно
d["w"] = 5
d["b"] = 3
for k, v in d.items():
    print(k, v)
'''
z 1
a 2
w 5
b 3

'''
  
  from collections import OrderedDict

od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3

print(list(od.keys()))  # вывод: ['a', 'b', 'c']

od['b'] = 5
print(list(od.items()))  # вывод: [('a', 1), ('b', 5), ('c', 3)]
  

Функции

namedtuple

Функция-фабрика namedtuple(name, fields) создаёт новый тип namedtuple с определённым именем и набором полей. Namedtuple — это подкласс tuple, который позволяет доступ к его полям не только по числовому индексу, но и по синтаксису доступа к атрибутам с использованием символических имён полей. Fields — это последовательность строк, которая определяет имена полей. Для совместимости с CPython fields также может быть строкой с пробелами (но это менее эффективно). Пример использования:

  from collections import namedtuple

MyTuple = namedtuple("MyTuple", ("id", "name"))
t1 = MyTuple(1, "foo")
t2 = MyTuple(2, "bar")

print(t1.name)  # вывод: foo
assert t2.name == t2[1]
  
  from collections import namedtuple

Point = namedtuple('Point', 'x y')
pt1 = Point(1.5, 4.7)
pt2 = Point(3.2, 6.5)

print(pt1.x, pt1.y)  # вывод: 1.5, 4.7
print(pt2[0], pt2[1])  # вывод: 3.2, 6.5

# Namedtuples также поддерживают использование методов, аналогичных `tuple`.
print(pt1._asdict())  # вывод: {'x': 1.5, 'y': 4.7}