collections — типы коллекций и контейнеров

Этот модуль предоставляет специализированные контейнерные типы данных, дополняющие встроенные list, tuple, dict и set: двустороннюю очередь (deque), фабрику кортежей с именованными полями (namedtuple()) и словарь, сохраняющий порядок (OrderedDict).

Классы

class collections.deque(iterable: Iterable, maxlen: int, flags: int = 0)

Деки (двусторонние очереди) — это контейнер, подобный списку, который поддерживает добавление и извлечение элементов с любой стороны за время O(1). Новые деки создаются с помощью следующих аргументов:

  • iterable — это итерируемый объект, используемый для заполнения дека при его создании. Это может быть пустой кортеж или список для создания изначально пустого дека.

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

  • Необязательный параметр flags может быть равен 1 для проверки переполнения при добавлении элементов.

Объекты дека поддерживают bool, len(), итерацию, а также чтение и запись по индексу. Они также имеют следующие методы:

append(x: Any) None

Добавляет x в правую часть дека. Возбуждает IndexError, если проверка переполнения включена и в очереди больше нет места.

appendleft(x: Any) None

Добавляет x в левую часть дека. Возбуждает IndexError, если проверка переполнения включена и в очереди больше нет места.

pop() Any

Удаляет и возвращает элемент из правой части дека. Возбуждает IndexError, если элементов нет.

popleft() Any

Удаляет и возвращает элемент из левой части дека. Возбуждает IndexError, если элементов нет.

extend(iterable: Iterable) None

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

collections.namedtuple(name: str, fields: str | Sequence[str]) type

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

from collections import namedtuple

MyTuple = namedtuple("MyTuple", ("id", "name"))
t1 = MyTuple(1, "foo")
t2 = MyTuple(2, "bar")
print(t1.name)
assert t2.name == t2[1]

Экземпляры также предоставляют следующий метод:

collections._asdict() OrderedDict

Возвращает имена полей и их значения в виде OrderedDict.

class collections.OrderedDict(*args: Any, **kwargs: Any)

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

from collections import OrderedDict

# To make benefit of ordered keys, OrderedDict should be initialized
# from sequence of (key, value) pairs.
d = OrderedDict([("z", 1), ("a", 2)])
# More items can be added as usual
d["w"] = 5
d["b"] = 3
for k, v in d.items():
    print(k, v)

Вывод:

z 1
a 2
w 5
b 3
popitem() Tuple

Удаляет и возвращает пару (key, value) из словаря. Пары возвращаются в порядке LIFO.

Отличие от CPython

OrderedDict.popitem() не поддерживает аргумент last=False и всегда удаляет и возвращает последний элемент, если он есть.

Обходным решением является использование pop(<first_key>) для удаления первого элемента:

first_key = next(iter(d))
d.pop(first_key)