Коллекции стандартной библиотеки: deque, Counter, defaultdict и ChainMap
Содержание курса
Группировка данных без проверок ключей с defaultdict
При группировке элементов по категориям обычный dict требует либо предварительной проверки if key not in d, либо вызова d.setdefault(key, []). Оба варианта загромождают код, а setdefault() ещё и создаёт пустой список в аргументе на каждом шаге цикла, даже если ключ уже существовал.
Для таких задач предназначен collections.defaultdict. Ему передают фабрику по умолчанию — вызываемый объект без аргументов (list, set, int), который создаёт начальное значение при первом обращении к отсутствующему ключу.
from collections import defaultdict
orders = [
("alice", "laptop"),
("bob", "mouse"),
("alice", "keyboard"),
("bob", "mouse"),
]
# Группировка уникальных покупок пользователей
purchases_by_user = defaultdict(set)
for user, item in orders:
purchases_by_user[user].add(item)
print(dict(purchases_by_user))
Вывод программы:
{'alice': {'laptop', 'keyboard'}, 'bob': {'mouse'}}
Ключевая особенность defaultdict заключается в методе __missing__(key). Фабрика вызывается только при обращении по квадратно-скобочному синтаксису d[key]. Если обратиться через d.get(key), метод __missing__ вызван не будет:
metrics = defaultdict(int)
# Доступ по индексу создаёт ключ
metrics["requests"] += 1
# Метод get не активирует фабрику
missing_value = metrics.get("errors")
print("metrics.get('errors'):", missing_value)
print("Словарь:", dict(metrics))
Вывод программы:
metrics.get('errors'): None
Словарь: {'requests': 1}
Это защищает от случайного замусоривания словаря при простом чтении неизвестных ключей через .get().
