Для чего используются основные классы из модуля collections в Python?

Ответ

Модуль collections в Python предоставляет специализированные типы данных-контейнеров, которые являются альтернативами встроенным dict, list, set и tuple.

Наиболее часто используемые классы:

  1. defaultdict Словарь, который не вызывает KeyError при обращении к несуществующему ключу. Вместо этого он создает элемент с помощью "фабрики", переданной при инициализации. Идеально подходит для группировки и подсчета элементов.

    from collections import defaultdict
    
    # При обращении к новому ключу будет вызван int(), который вернет 0
    word_counts = defaultdict(int)
    words = ['apple', 'banana', 'apple']
    for word in words:
        word_counts[word] += 1
    # word_counts -> defaultdict(<class 'int'>, {'apple': 2, 'banana': 1})
  2. Counter Специализированный словарь для подсчета хешируемых объектов. Упрощает код для подсчета частоты встречаемости элементов в последовательности.

    from collections import Counter
    
    colors = ['red', 'blue', 'red', 'green', 'blue', 'red']
    color_counts = Counter(colors)
    # color_counts -> Counter({'red': 3, 'blue': 2, 'green': 1})
    print(color_counts.most_common(1)) # [('red', 3)]
  3. namedtuple Фабричная функция для создания кортежей, к элементам которых можно обращаться по именам полей. Делает код более читаемым без необходимости создавать полноценный класс.

    from collections import namedtuple
    
    Point = namedtuple('Point', ['x', 'y'])
    p = Point(10, 20)
    print(f"{p.x=}, {p.y=}") # p.x=10, p.y=20
  4. deque (двусторонняя очередь) Список, оптимизированный для быстрых операций добавления и удаления элементов с обоих концов (сложность O(1)). Обычный list имеет сложность O(n) для операций в начале. Используется для реализации очередей и стеков.

    from collections import deque
    
    # Очередь с максимальной длиной 3
    last_three_items = deque(maxlen=3)
    last_three_items.append(1)
    last_three_items.append(2)
    last_three_items.append(3)
    last_three_items.append(4) # 1 будет вытеснен
    # last_three_items -> deque([2, 3, 4], maxlen=3)
    
    last_three_items.popleft() # вернет 2

Также полезны:

  • OrderedDict: До Python 3.7 был единственным словарем, сохраняющим порядок вставки ключей. Сейчас стандартный dict также гарантирует порядок.
  • ChainMap: Группирует несколько словарей в одно представление для поиска (поиск идет по словарям последовательно).