Каково назначение модуля 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().