← Назад к вопросам

Что такое defaultdict?

3.0 Senior🔥 221 комментариев
#DevOps и инфраструктура#Django

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

DefaultDict в Python

DefaultDict — это подкласс обычного словаря из модуля collections, который автоматически инициализирует значение для отсутствующего ключа при первом обращении. Это решает проблему KeyError, который выбрасывается обычным словарём при попытке доступа к несуществующему ключу.

Основная идея

Вместо того чтобы проверять наличие ключа перед использованием, defaultdict создаёт значение по умолчанию автоматически. Это особенно полезно при работе с подсчётом элементов, группировкой данных или построением графов зависимостей.

Синтаксис и примеры

from collections import defaultdict

# Создание defaultdict с функцией по умолчанию
counter = defaultdict(int)  # Значение по умолчанию: 0
groups = defaultdict(list)  # Значение по умолчанию: []
flags = defaultdict(bool)   # Значение по умолчанию: False

Функция (factory), переданная в конструктор, вызывается без аргументов для создания значения по умолчанию.

Пример 1: Подсчёт элементов

from collections import defaultdict

words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
word_count = defaultdict(int)

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

print(word_count)  # defaultdict(<class int>, {apple: 3, banana: 2, cherry: 1})

Без defaultdict пришлось бы писать:

word_count = {}
for word in words:
    if word not in word_count:
        word_count[word] = 0
    word_count[word] += 1

Пример 2: Группировка данных

from collections import defaultdict

students = [("Alice", "Math"), ("Bob", "English"), ("Alice", "Science"), ("Bob", "Math")]
groups = defaultdict(list)

for name, subject in students:
    groups[name].append(subject)

print(groups)  # defaultdict(<class list>, {Alice: [Math, Science], Bob: [English, Math]})

Пример 3: Сложная структура данных

from collections import defaultdict

# Граф смежности для связного графа
graph = defaultdict(list)
graph["A"].append("B")
graph["A"].append("C")
graph["B"].append("A")

print(graph)  # defaultdict(<class list>, {A: [B, C], B: [A]})

Различие между defaultdict и обычным dict

from collections import defaultdict

# Обычный словарь
regular_dict = {}
print(regular_dict["missing"])  # KeyError: missing

# defaultdict
default_dict = defaultdict(int)
print(default_dict["missing"])  # 0 (значение по умолчанию)

Методы и особенности

  • default_factory — атрибут, который хранит функцию, создающую значение по умолчанию
  • __missing__(key) — внутренний метод, вызываемый при доступе к отсутствующему ключу
  • Поддерживает все операции обычного словаря: .keys(), .values(), .items(), .update() и т.д.

Пример с кастомной factory

from collections import defaultdict

def create_default():
    return {"count": 0, "processed": False}

data = defaultdict(create_default)
data["item1"]["count"] += 1

print(data)  # defaultdict(<function create_default at ...>, {item1: {count: 1, processed: False}})

Важные замечания

  • defaultdict вызывает factory только при обращении к отсутствующему ключу через [], но НЕ при использовании .get(), .pop() или других методов
  • Если установить default_factory = None, defaultdict будет работать как обычный словарь
  • При итерации по существующим ключам defaultdict не создаёт новые значения

Когда использовать defaultdict

  • Подсчёт элементов и частоты — вместо проверки наличия ключа
  • Группировка данных — создание списков или множеств по категориям
  • Построение графов и связных структур — упрощение кода
  • Аккумуляция значений — когда нужно собирать данные по ключам

defaultdict делает код чище, читаемее и менее подвержен ошибкам, избегая необходимости проверки наличия ключей перед операциями.

Что такое defaultdict? | PrepBro