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

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

Класи

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

Deque (двостороння черга) — це контейнер, схожий на список, що підтримує операції додавання та видалення за O(1) з обох кінців. Нові deque створюються з такими аргументами:

  • iterable — ітерований об’єкт, що використовується для заповнення deque під час створення. Може бути порожнім кортежем або списком для створення початково порожньої черги.

  • maxlen є обов’язковим параметром, що обмежує максимальну довжину deque. Коли черга заповниться, нові елементи видалятимуть елементи з протилежного кінця.

  • Необов’язковий параметр flags може дорівнювати 1, щоб перевіряти переповнення при додаванні елементів.

Об’єкти Deque підтримують bool, len(), ітерацію, а також завантаження та збереження за індексом. Вони також мають такі методи:

append(x: Any) None

Додає x до правого кінця deque. Якщо перевірку переповнення увімкнено і в черзі немає місця, виникає IndexError.

appendleft(x: Any) None

Додає x до лівого кінця deque. Якщо перевірку переповнення увімкнено і в черзі немає місця, виникає IndexError.

pop() Any

Видаляє та повертає елемент з правого кінця deque. Якщо елементів немає, виникає IndexError.

popleft() Any

Видаляє та повертає елемент з лівого кінця deque. Якщо елементів немає, виникає IndexError.

extend(iterable: Iterable) None

Розширює deque, додаючи всі елементи з 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), інше відображення або іменовані аргументи). Під час ітерації по OrderedDict ключі/елементи повертаються у порядку їх додавання:

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

Видаляє та повертає пару (ключ, значення) зі словника. Пари повертаються у порядку LIFO.

Відмінність від CPython

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

Обхідним рішенням є використання pop(<first_key>) для видалення першого елемента:

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