Задание 23. Решение алгоритмических задач
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"])
Если попытаться получить значение по ключу, которого нет, программа выдаёт ошибку. В приведённой задаче это строка 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)
 
print(dict(graph))
print("Соседи A:", graph["A"])
print("Соседи B:", graph["B"])
print("Соседи C:", graph["C"])
print("Соседи F:", graph["F"])
Результат:
primer3.jpg
 
В словаре нет ключа \(F\), но он автоматически создан. Подкласс словаря defaultdict не выдаёт ошибку, а создаёт вершину и в качестве её соседей формирует пустой список.
 
Пример «Подсчёт количества слов»
 
В приведённом тексте подсчитать, сколько раз встречается каждое слово.
from collections import defaultdict
 
text \(=\) input()
words \(=\) text.split()
 
count \(=\) defaultdict(int) # int() даёт \(0\)
for w in words:
    count[w] \(+\)\(= \) \(1 \) # если ключа нет, он создаётся со значением \(0\)
 
print(dict(count))
 podscet_kolva_slov.jpg
 
Обрати внимание!
Важно: в качестве аргумента для defaultdict указывается тип или функция, которая создаёт значение, а не само значение.
В предыдущем примере это тип int(), так как мы хотим получить целое значение.
 
Пример «Группировка элементов по признаку»
 
В качестве исходных данных есть имя ученика и предмет, который он выбрал. Нужно для каждого имени сформировать список предметов.
data \(=\) [("Аня", "математика"),
    ("Боря", "физика"),
    ("Аня", "информатика"),
    ("Боря", "математика")]
 
from collections import defaultdict
 
groups \(=\) defaultdict(list)  # по умолчанию пустой список
for name, subject in data:
    groups[name].append(subject)
 
print(dict(groups))
# {'Аня': ['математика', 'информатика'], 'Боря': ['физика', 'математика']}