Что такое defaultdict в Python и в чем его отличие от обычного словаря

Ответ

defaultdict — это подкласс стандартного словаря (dict) из модуля collections, который упрощает обработку отсутствующих ключей.

Ключевое отличие от dict: При попытке доступа к несуществующему ключу defaultdict не вызывает ошибку KeyError. Вместо этого он вызывает фабричную функцию, переданную при его создании, чтобы сгенерировать значение по умолчанию для этого ключа, после чего возвращает его.

Сравнение dict и defaultdict

Задача: подсчитать количество вхождений каждого элемента в списке.

1. С использованием обычного dict: Требуется вручную проверять наличие ключа.

words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
word_counts = {}

for word in words:
    if word not in word_counts:
        word_counts[word] = 0
    word_counts[word] += 1

# {'apple': 3, 'banana': 2, 'orange': 1}

2. С использованием defaultdict: Код становится чище и лаконичнее. В качестве фабричной функции используется int, которая по умолчанию возвращает 0.

from collections import defaultdict

words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
# При обращении к новому ключу будет вызван int(), который вернет 0
word_counts = defaultdict(int)

for word in words:
    word_counts[word] += 1

# defaultdict(<class 'int'>, {'apple': 3, 'banana': 2, 'orange': 1})

Другие примеры использования

  • Группировка данных: defaultdict(list) для сбора значений в списки.
    pairs = [('a', 1), ('b', 2), ('a', 3)]
    grouped = defaultdict(list)
    for key, value in pairs:
        grouped[key].append(value)
    # defaultdict(<class 'list'>, {'a': [1, 3], 'b': [2]})
  • Создание вложенных словарей: defaultdict(dict).