Специализированные структуры данных и потоковая обработка

Коллекции стандартной библиотеки: 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().

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения и доступны преподавателям курса. Чтобы попросить преподавателя подключиться, отправьте обращение из диалога.

Проверка решения остаётся отдельным действием.