Как перебирать словарь в Python

Введение
Умение перебирать словарь в Python полезно для чтения, изменения и вывода данных. Для новичков это может быть немного запутанным, особенно если словарь вложенный или требуется специфичный порядок. Ниже — практическое руководство с примерами, подсказками и шаблонами.
Перебор ключей и значений
Словарь в Python содержит пары ключ–значение. Чтобы перебрать ключи, можно использовать метод keys():
myDict = {"A" : 2, "B" : 5, "C" : 6}
for i in myDict.keys():
print("Key" + " " + i)
# Вывод:
# Key A
# Key B
# Key CОднако ключи можно получать напрямую при итерации по словарю — for по словарю возвращает ключи по умолчанию:
for key in myDict:
print("Key" + " " + key)
# Вывод:
# Key A
# Key B
# Key CЧтобы получить только значения, используйте values():
for i in myDict.values():
print(i)
# Вывод:
# 2
# 5
# 6Или обращайтесь к значениям по ключам:
for key in myDict:
print(myDict[key])
# Вывод:
# 2
# 5
# 6Можно одновременно получать и ключи, и значения двумя способами. Первый — получать значение через обращение по ключу внутри цикла:
for key in myDict:
print(key, "|", myDict[key])
# Вывод:
# A | 2
# B | 5
# C | 6Второй — использовать .items(), который возвращает пары (ключ, значение):
for key, value in myDict.items():
print(key, "|", value)
# Вывод:
# A | 2
# B | 5
# C | 6Иногда нужен обратный порядок — примените sorted() с reverse=True:
for key, value in sorted(myDict.items(), reverse=True):
print(key, "|", value)
# Вывод:
# C | 6
# B | 5
# A | 2Преобразование словаря в список
Перевести словарь в список проще простого. Можно получить список кортежей (ключ, значение):
myDict = {"A" : "MUO", "B" : "Google", "C" : "Python"}
myList = []
for key, value in myDict.items():
myList.append((key, value))
print(myList)
# Вывод: [('A', 'MUO'), ('B', 'Google'), ('C', 'Python')]Или вложенный список пар:
myList = []
for key, value in myDict.items():
myList.append([key, value])
print(myList)
# Вывод: [['A', 'MUO'], ['B', 'Google'], ['C', 'Python']]Если нужно «сплющить» словарь в одноуровневый список:
myList = []
for key, value in myDict.items():
myList += key, value
print(myList)
# Вывод: ['A', 'MUO', 'B', 'Google', 'C', 'Python']Аналогичные преобразования можно выполнить через списковые включения (list comprehensions) и через itertools.
Суммирование значений словаря
Чтобы сложить все числовые значения словаря в цикле:
myDict = {"A":6, "B":7, "C":9}
g = 0 # инициализация переменной для накопления
for i in myDict.values():
g += i # добавляем каждое значение
print(g)
# Вывод: 22Но проще и чище — использовать встроенную функцию sum(), которая уже итерирует коллекцию:
summedValues = sum(myDict.values())
print(summedValues)
# Вывод: 22Перебор вложенного словаря
Вложенные словари обрабатываются так же, как обычные, но нередко требуется вложенная итерация:
myDict = {"A" : [1, 2, 3], "B" : [4, 5, 6]}
for i in myDict.keys():
print(myDict[i])
# Вывод:
# [1, 2, 3]
# [4, 5, 6]Если перебрать items(), получите кортежи с подсписками:
for i in myDict.items():
print(i)
# Вывод:
# ('A', [1, 2, 3])
# ('B', [4, 5, 6])Сложный пример — словарь, значения которого сами по себе словари:
complexArray = {
"Detail" : {
"Name" : "Idowu",
"Logs" : 20,
"isAdmin" : True
},
"Activities" : {
"Inputs" : 14,
"Input Type" : "Video"
}
}
for value in complexArray.values():
print(value)
# Вывод:
# {'Name': 'Idowu', 'Logs': 20, 'isAdmin': True}
# {'Inputs': 14, 'Input Type': 'Video'}Чтобы получить только значения из дочернего словаря “Detail”:
for value in complexArray["Detail"].values():
print(value)
# Вывод:
# Idowu
# 20
# TrueВложенные циклы позволяют пройти по всем дочерним значениям сразу:
for value in complexArray.values():
for i in value.values(): # получаем значения в дочерних словарях
print(i)
# Вывод:
# Idowu
# 20
# True
# 14
# VideoМожно также использовать рекурсивные функции для произвольной глубины вложенности.
Изменение элементов словаря при итерации
Словарь изменяем, поэтому его содержимое можно менять в процессе обработки. Например, переставить местами ключи и значения:
myDict = {"A" : "MUO", "B" : "Google", "C" : "Python"}
swappedDict = {}
for key, value in myDict.items():
swappedDict[value] = key
print(swappedDict)
# Вывод: {'MUO': 'A', 'Google': 'B', 'Python': 'C'}То же самое удобно сделать в виде словарного включения:
swappedDict = {value: key for key, value in myDict.items()}
print(swappedDict)
# Вывод: {'MUO': 'A', 'Google': 'B', 'Python': 'C'}Будьте осторожны при удалении элементов во время итерации: изменять структуру словаря, по которому вы сами же итерируетесь, может привести к неожиданным результатам. Решение — итерировать по копии списка ключей list(myDict.keys()). Пример удаления и последующей вставки:
myDict = {"A" : "MUO", "B" : "Google", "C" : "Python", "C" : "Python"}
for key in list(myDict.keys()):
if key == 'C':
del myDict[key]
myDict[key] = "Python"
print(myDict)
# Вывод: {'A': 'MUO', 'B': 'Google', 'C': 'Python'}Альтернативные подходы и полезные функции
- dict.items(), dict.keys(), dict.values() — стандартный набор.
- Словарные включения (dict comprehensions) дают компактный код для преобразований.
- Функции sum(), any(), all(), max(), min() работают с результатами dict.values() или dict.items().
- itertools.chain и map полезны для сложных трансформаций и «сплющивания» данных.
- pandas.Series или DataFrame удобны при обработке больших табличных наборов данных.
Когда перебор словаря может не сработать
- Нельзя надёжно модифицировать словарь (добавлять/удалять ключи) во время итерации по самим ключам без предварительной копии — это ведёт к ошибкам или пропуску элементов.
- До Python 3.7 порядок ключей не гарантирован; полагаться на порядок допустимо, начиная с 3.7 (имплементация CPython сохраняет порядок вставки).
- При большой глубине вложенности рекурсивная итерация может превысить лимит стека — используйте явный стек или итеративный подход.
Шпаргалка: быстрые приёмы
- Все ключи: for k in d:
- Все значения: for v in d.values():
- Ключи+значения: for k, v in d.items():
- Сумма значений: sum(d.values())
- Инвертировать словарь: {v: k for k, v in d.items()}
- Удаление при итерации: for k in list(d.keys()): …
Практическая методика (шаги)
- Решите, нужны ли вам ключи, значения или пары.
- Если будут удаления — создайте list(d.keys()) и итерируйте по ней.
- Для упорядочивания примените sorted() к items() или keys().
- Для вложенных структур используйте вложенные циклы или рекурсию.
- После изменений проверьте инварианты словаря (уникальность ключей, типы значений).
Проверки и критерии приёмки
- Все ожидаемые ключи присутствуют после преобразований.
- Типы значений соответствуют спецификации (напр., числа там, где ожидаются числа).
- Операция не теряет элементы и не вызывает исключений при корректных входных данных.
- Тесты покрывают краевые случаи: пустой словарь, единственный элемент, дубликаты по значению.
Роли и чек-листы
Для новичка:
- Понимаю, что for по словарю возвращает ключи.
- Использую .items() для пар.
- Не удаляю элементы без list(keys()).
Для разработчика:
- Применяю comprehensions там, где это упрощает код.
- Профилирую операции при больших словарях (память и время).
- Покрываю unit-тестами преобразования словарей.
Факт-бокс
- Время перебора n элементов: O(n).
- dict.items(), dict.keys(), dict.values() возвращают представления (view), не копии, поэтому их можно эффективно использовать для чтения.
Глоссарий (одна строка)
- Словарь (dict): структура данных с быстрым доступом по ключу.
- items(): возвращает пары (ключ, значение).
- values(): возвращает коллекцию значений.
- keys(): возвращает коллекцию ключей.
Часто задаваемые вопросы
Как безопасно удалить элементы при переборе?
Итерируйте по копии списка ключей: for k in list(d.keys()): if условие: del d[k].
Можно ли полагаться на порядок ключей?
В CPython 3.7+ порядок вставки гарантируется, но лучше явно сортировать, если нужен определённый порядок.
Краткое резюме
Перебор словаря в Python — базовый навык: используйте for по словарю для ключей, .values() для значений, .items() для пар. Для изменений при итерации копируйте ключи. Для компактных преобразований применяйте словарные включения. Наконец, тестируйте трансформации и учитывайте вложенность.
Важно: при работе с большими или глубоко вложенными структурами думайте о памяти и ограничениях рекурсии.