Перебор словаря и вложенные структуры
Содержание курса
Словарь со списком в качестве значения и вложенный цикл
До сих пор значениями словаря были простые объекты — строки, числа. Но значением может быть и список. Это позволяет группировать несколько связанных элементов под одним ключом.
Пример: словарь учебных предметов, где к каждому предмету привязан список тем:
courses = {
'математика': ['алгебра', 'геометрия'],
'физика': ['механика', 'оптика']
}
Чтобы обратиться к конкретной теме, используется двойная индексация — сначала ключ словаря, затем индекс внутри списка:
print(courses['физика'][0]) # механика
Первая пара скобок достаёт список по ключу 'физика', вторая — берёт нулевой элемент из этого списка.
Когда нужно пройтись по всем предметам и их темам сразу, одного цикла не хватит. Внешний цикл перебирает пары предмет → список тем, внутренний — темы внутри каждого списка:
for subject, topics in courses.items():
for topic in topics:
print(f'{subject} — {topic}')
Вывод:
математика — алгебра математика — геометрия физика — механика физика — оптика
Здесь subject — это ключ (название предмета), topics — список тем, который был значением в словаре. На каждой итерации внешнего цикла переменная topics содержит очередной список, и внутренний for topic in topics проходит по его элементам.
Это двухуровневая итерация: количество шагов внутреннего цикла зависит от длины каждого конкретного списка-значения, а не фиксировано заранее. Если у одного предмета три темы, а у другого — пять, внутренний цикл выполнится соответствующее количество раз.
Такую структуру — словарь, где ключи это категории, а значения это списки элементов — используют часто: список покупок по категориям, сотрудники по отделам, тэги по статьям. Паттерн один и тот же: внешний for k, v in d.items(), внутренний for item in v.
