Модуль collections
Специализированные контейнеры-датаклассы
Модуль 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}