Короткий ответ
Для перебора словаря используют сам словарь или .keys() для ключей, .values() для значений и .items() для пар (ключ, значение) — во всех случаях начиная с Python 3.7 порядок перебора соответствует порядку вставки ключей.
Как это работает подробнее
for key in d: и for key in d.keys(): эквивалентны и дают ключи. for value in d.values(): даёт значения без привязки к ключам. for key, value in d.items(): возвращает пары, которые удобно распаковывать прямо в заголовке цикла. Все три представления — "живые" view-объекты: они отражают изменения словаря, если словарь меняется во время итерации по отдельному, не связанному с ней коду.
Пример кода
example.py
prices = {"apple": 100, "banana": 50, "cherry": 300}
for name, price in prices.items():
print(f"{name}: {price} руб.")
expensive = {name: price for name, price in prices.items() if price > 60}
print(expensive) # {'apple': 100, 'cherry': 300}
for name in list(prices.keys()): # копия ключей — безопасно удалять во время обхода
if prices[name] < 60:
del prices[name]
print(prices) # {'apple': 100, 'cherry': 300}Что использовать на практике
- Практика.
.items()— самый частый выбор, когда внутри цикла нужны и ключ, и значение. Если нужен словарь, отфильтрованный или преобразованный, часто используют dict comprehension:{k: v for k, v in d.items() if condition}.
Подводные камни
- Риски. Изменяют словарь (добавляют/удаляют ключи) прямо во время итерации по нему — это вызывает
RuntimeError: dictionary changed size during iteration. Чтобы безопасно изменять словарь во время обхода, итерируются по копии ключей:for key in list(d.keys()):.