3.
Словарь defautdict для решения задания № 23 ЕГЭ по информатике
Теория
Словарь в Python — организация данных, отвечающая шаблону «ключ — значение». В качестве примера приведём программу, которая строит неориентированный граф в виде словаря смежности.
edges \(=\) [("A", "B"),
("A", "C"),
("B", "D"),
("C", "D"),]
graph \(=\) {}
for u, v in edges:
if u not in graph:
graph[u] \(=\) []
if v not in graph:
graph[v] \(=\) []
graph[u].append(v)
graph[v].append(u)
print(graph) # смотрим, как сформирован словарь
# Использование: выводим соседей
print("Соседи A:", graph["A"])
print("Соседи B:", graph["B"])
print("Соседи C:", graph["C"])
#print("Соседи F:", graph["F"])
("A", "C"),
("B", "D"),
("C", "D"),]
graph \(=\) {}
for u, v in edges:
if u not in graph:
graph[u] \(=\) []
if v not in graph:
graph[v] \(=\) []
graph[u].append(v)
graph[v].append(u)
print(graph) # смотрим, как сформирован словарь
# Использование: выводим соседей
print("Соседи A:", graph["A"])
print("Соседи B:", graph["B"])
print("Соседи C:", graph["C"])
#print("Соседи F:", graph["F"])
Если попытаться получить значение по ключу, которого нет, программа выдаёт ошибку. В приведённой задаче это строка print("Соседи F:", graph["F"]).
Подкласс словаря defaultdict из модуля collections автоматически создаёт значение по умолчанию, если ключа ещё нет.
Включим его в программу:
from collections import defaultdict
edges \(=\) [("A", "B"),
("A", "C"),
("B", "D"),
("C", "D")]
graph \(=\) defaultdict(list)
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
("A", "C"),
("B", "D"),
("C", "D")]
graph \(=\) defaultdict(list)
for u, v in edges:
graph[u].append(v)
graph[v].append(u)
print(dict(graph))
print("Соседи A:", graph["A"])
print("Соседи B:", graph["B"])
print("Соседи C:", graph["C"])
print("Соседи F:", graph["F"])
print("Соседи A:", graph["A"])
print("Соседи B:", graph["B"])
print("Соседи C:", graph["C"])
print("Соседи F:", graph["F"])
Результат:

В словаре нет ключа \(F\), но он автоматически создан. Подкласс словаря defaultdict не выдаёт ошибку, а создаёт вершину и в качестве её соседей формирует пустой список.
Пример «Подсчёт количества слов»
В приведённом тексте подсчитать, сколько раз встречается каждое слово.
from collections import defaultdict
text \(=\) input()
words \(=\) text.split()
words \(=\) text.split()
count \(=\) defaultdict(int) # int() даёт \(0\)
for w in words:
count[w] \(+\)\(= \) \(1 \) # если ключа нет, он создаётся со значением \(0\)
for w in words:
count[w] \(+\)\(= \) \(1 \) # если ключа нет, он создаётся со значением \(0\)
print(dict(count))

Обрати внимание!
Важно: в качестве аргумента для defaultdict указывается тип или функция, которая создаёт значение, а не само значение.
В предыдущем примере это тип int(), так как мы хотим получить целое значение.
Пример «Группировка элементов по признаку»
В качестве исходных данных есть имя ученика и предмет, который он выбрал. Нужно для каждого имени сформировать список предметов.
data \(=\) [("Аня", "математика"),
("Боря", "физика"),
("Аня", "информатика"),
("Боря", "математика")]
("Боря", "физика"),
("Аня", "информатика"),
("Боря", "математика")]
from collections import defaultdict
groups \(=\) defaultdict(list) # по умолчанию пустой список
for name, subject in data:
groups[name].append(subject)
groups[name].append(subject)
print(dict(groups))
# {'Аня': ['математика', 'информатика'], 'Боря': ['физика', 'математика']}
# {'Аня': ['математика', 'информатика'], 'Боря': ['физика', 'математика']}