Каково назначение модуля collections в Python и какие классы он предоставляет?

Ответ

Модуль 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 — это такая палочка-выручалочка, когда стандартных типов уже не хватает, а писать свою хитровыебанную реализацию — лень и времени ноль ебать. Бери и пользуйся, всё уже придумано до нас!