Ответ
Модуль collections в Python предоставляет высокопроизводительные альтернативы и расширения для встроенных типов данных (контейнеров), таких как dict, list, set и tuple.
Основные классы и их назначение:
-
Counter: Словарь для подсчета хешируемых объектов. Удобен для вычисления частоты элементов в последовательности.from collections import Counter c = Counter('abracadabra') print(c.most_common(1)) # [('a', 5)] -
deque(double-ended queue): Двусторонняя очередь, оптимизированная для быстрого добавления и удаления элементов с обоих концов (O(1)). Гораздо эффективнее, чемlistдля операцийpop(0)иinsert(0, v).from collections import deque d = deque([1, 2, 3]) d.appendleft(0) # Быстрое добавление в начало d.pop() # Быстрое удаление с конца # d -> deque([0, 1, 2]) -
defaultdict: Подклассdict, который вызывает фабричную функцию для предоставления значения по умолчанию для отсутствующего ключа. Это избавляет от необходимости проверять наличие ключа.from collections import defaultdict dd = defaultdict(int) # Значение по умолчанию - 0 dd['non_existent_key'] += 1 print(dd['non_existent_key']) # 1 (без KeyError) -
namedtuple(): Фабричная функция для создания кортежей с именованными полями. Делает код более читаемым, позволяя обращаться к элементам по имени, а не по индексу.from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(11, y=22) print(p.x + p.y) # 33 (более читаемо, чем p[0] + p[1]) -
OrderedDict: Словарь, который помнит порядок добавления ключей. С Python 3.7+ стандартныйdictтакже сохраняет порядок вставки, ноOrderedDictостается полезным для обратной совместимости и из-за наличия методаmove_to_end().
Ответ 18+ 🔞
Э, слушай, а вот этот ваш модуль collections в Питоне — это же просто песня, а не штука! Ну, понимаешь, как будто тебе дали стандартные контейнеры — dict, list и прочую хуйню — а потом говорят: «А вот, на, ещё и улучшенные версии, с прибамбасами». И ведь реально удобно, ёпта!
Вот смотри, какие там классы есть, просто овердохуище полезных:
-
Counter— это, блядь, гениальная хуйня. Словарь, который сам всё считает. Кинул туда строку, список — и он тебе разложит по полочкам, сколько раз какая хрень встретилась. Красота же!from collections import Counter c = Counter('abracadabra') print(c.most_common(1)) # [('a', 5)]Смотри, буква 'a' там аж пять раз! Сам посчитал, пидарас умный.
-
deque— это, сука, очередь с двумя концами. Ну, типа как очередь в магазине, но ты можешь и в начало встать, если очень надо. Главная фишка — он охуенно быстрый, когда надо что-то добавить или убрать с любого края. С обычным списком (list) еслиpop(0)делать — это пиздец как медленно, а тут — раз, и готово.from collections import deque d = deque([1, 2, 3]) d.appendleft(0) # Ёбнул нолик в начало — быстро! d.pop() # Выдернул с конца — тоже быстро! # d -> deque([0, 1, 2]) -
defaultdict— вот это, блядь, спасение для ленивых (как я). Обычный словарь, если ключа нет — выдаётKeyErrorи заставляет тебя проверять или черезtry/exceptоборачивать. А этот гад — ты ему говоришь, какое значение по умолчанию нужно, и он его сам подставляет, если ключа нет. Вообще красота!from collections import defaultdict dd = defaultdict(int) # Говорим: «По умолчанию — ноль, блядь» dd['non_existent_key'] += 1 # Ключа нет? Не, ну и хуй с ним, создаст с нулём и прибавит единицу. print(dd['non_existent_key']) # 1 — и никаких ошибок! -
namedtuple()— функция, которая создаёт кортежи, но не простые, а с именами. Ну, типа, обычный кортеж — этоp[0],p[1]. А тут ты создаёшь тип, скажем,Point, и обращаешьсяp.x,p.y. Код сразу читается, как роман, а не как шифровка, блядь.from collections import namedtuple Point = namedtuple('Point', ['x', 'y']) p = Point(11, y=22) print(p.x + p.y) # 33 — и сразу понятно, что к чему, а не пиздец какой-то с индексами. -
OrderedDict— словарь, который помнит, в каком порядке ты туда ключи пихал. Раньше это была уникальная фича, а сейчас, с Питона 3.7, обычныйdictтоже порядок помнит. Но этот остаётся, например, из-за методаmove_to_end()— можно ключ в конец или начало перекинуть, хитрая жопа.
Короче, collections — это такая палочка-выручалочка, когда стандартных типов уже не хватает, а писать свою хитровыебанную реализацию — лень и времени ноль ебать. Бери и пользуйся, всё уже придумано до нас!