Ответ
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)
.