Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 делает код чище, читаемее и менее подвержен ошибкам, избегая необходимости проверки наличия ключей перед операциями.