Перебор словаря в Python: items(), keys(), values()

Перебор словаря в Python: items(), keys(), values() Полезное

Словарь (dict) в Python — это структура данных, которая хранит пары «ключ — значение» и позволяет получать значение по ключу за одно обращение, без перебора всех элементов. Ключи должны быть хешируемыми (строки, числа, кортежи), значения — любыми. В статье разберем три способа перебора словаря: через items(), keys() и values(), а также проверку наличия ключа оператором in.

Создание словаря и базовые операции

Словарь задается фигурными скобками, пары разделяются запятой, ключ и значение — двоеточием:

student = {"name": "Anna", "course": "Python", "level": "basic"}
print(student["course"])

Результат:

Python

Обращение по несуществующему ключу вызывает ошибку. Разберем это на примере тройки неверный код -> результат -> исправление.

Неверно — обращение к отсутствующему ключу через квадратные скобки:

prices = {"tea": 120, "coffee": 180}
print(prices["juice"])

Фактический результат:

KeyError: 'juice'

Исправление — метод get() со значением по умолчанию, которое возвращается вместо ошибки:

print(prices.get("juice", 0))

Результат:

0

Добавление, обновление и удаление пар

Новую пару добавляют присваиванием по новому ключу, обновляют — присваиванием по существующему:

prices["juice"] = 150
prices["tea"] = 130
print(prices)

Результат:

{'tea': 130, 'coffee': 180, 'juice': 150}

Значение tea заменилось на 130, juice добавился в конец. Удаляют пару оператором del или методом pop() (последний еще и возвращает удаленное значение):

removed = prices.pop("coffee")
print(removed, prices)

Результат:

180 {'tea': 130, 'juice': 150}

Для добавления сразу нескольких пар удобен update(), который принимает другой словарь и объединяет его с текущим:

prices.update({"cola": 140, "tea": 135})
print(prices)

Результат:

{'tea': 135, 'juice': 150, 'cola': 140}

tea снова обновился (был уже в словаре), cola добавился новым ключом.

Три способа перебора словаря

Словарь можно перебирать по ключам, по значениям или сразу по парам. Ниже — минимальный рабочий пример на всех трех подряд, затем разбор каждого.

menu = {"tea": 130, "coffee": 180, "juice": 150}

for key in menu.keys():
    print(key)

for value in menu.values():
    print(value)

for key, value in menu.items():
    print(key, "->", value)

Результат (три блока подряд, в порядке вызовов):

tea
coffee
juice
130
180
150
tea -> 130
coffee -> 180
juice -> 150

Перебор через items()

items() возвращает объект-представление (view) из пар ключ-значение. Каждая пара при переборе — это кортеж, который цикл for автоматически распаковывает в две переменные:

for key, value in menu.items():
    print(f"{key}: {value} руб.")

Результат:

tea: 130 руб.
coffee: 180 руб.
juice: 150 руб.

Это основной способ, если нужен доступ и к ключу, и к значению одновременно — например, для форматированного вывода или фильтрации по обоим полям.

Перебор через keys()

keys() возвращает представление только ключей. Он нужен, когда значения на этом шаге не важны — например, для проверки состава словаря:

for key in menu.keys():
    print(key.upper())

Результат:

TEA
COFFEE
JUICE

Вызов .keys() можно опустить: for key in menu работает так же, потому что словарь по умолчанию перебирается по ключам. Явный .keys() оставляют для читаемости кода.

Перебор через values()

values() возвращает представление значений без ключей. Удобен, когда нужна агрегация по значениям:

total = sum(menu.values())
print(total)

Результат:

460

Если внутри цикла понадобится и ключ, values() для этого не подходит — тогда нужен items().

Сохранение порядка вставки

Начиная с версии Python 3.7 сохранение порядка вставки ключей в dict — гарантия языка (зафиксирована в спецификации CPython), а не случайность реализации. До этого, в CPython 3.6, поведение уже было таким же, но считалось деталью реализации, на которую нельзя было полагаться. На практике это значит: элементы из примеров выше в Python 3.7+ всегда выводятся в том порядке, в котором были добавлены в словарь, а не в произвольном.

Проверка ключа оператором in

Оператор in проверяет членство и по умолчанию ищет среди ключей — без перебора вручную:

if "tea" in menu:
    print("Есть в меню")
else:
    print("Нет в меню")

Результат:

Есть в меню

Для проверки по значению нужно явно указать .values(), иначе in будет искать среди ключей и не найдет совпадение:

print(130 in menu.values())

Результат:

True

Какой способ перебора выбрать

Метод Что возвращает Когда использовать
.keys() (или просто for key in dict) представление ключей нужны только ключи, значения не важны
.values() представление значений нужна агрегация или обработка значений без ключей
.items() представление пар (ключ, значение) нужен доступ и к ключу, и к значению в одном проходе

Выводы

  • Словарь Python хранит пары «ключ — значение»; обращение по ключу быстрее полного перебора.
  • items() дает пары ключ-значение, keys() — только ключи, values() — только значения.
  • С Python 3.7 порядок перебора словаря гарантированно совпадает с порядком вставки ключей.
  • Оператор in по умолчанию проверяет ключи; для проверки значений нужен .values().
  • Обращение по отсутствующему ключу через [] вызывает KeyError; безопасная альтернатива — .get().

Где применяется / связь с практикой

Словари используются почти в любой задаче на Python: разбор ответов API в формате JSON, подсчет частот слов, хранение настроек и конфигураций, кеширование результатов по ключу. Уверенное владение перебором словарей и другими базовыми структурами данных — основа для дальнейшей работы с обработкой данных и бэкендом.

Освойте тему на практике

Если нужно системно закрыть базовые темы Python (структуры данных, функции, ООП, работа с файлами) — можно пройти курс Python Basic в Otus. Проверить формат и посмотреть на живой пример занятия можно на открытых уроках Otus.

Смежные темы: Циклы в Python: особенности и определение, Типы данных в языках программирования.

FAQ

Можно ли перебирать словарь и одновременно менять его размер внутри цикла?
Нет, добавление или удаление ключей во время перебора вызывает RuntimeError: dictionary changed size during iteration. Нужно сначала собрать список ключей для изменения, потом менять словарь отдельным циклом.

Чем dict.keys() отличается от простого списка ключей?
keys() возвращает не список, а динамическое представление (view): оно отражает текущее состояние словаря без копирования данных. Если нужен именно список — оборачивают в list(menu.keys()).

Что быстрее — in menu или in menu.keys() для проверки ключа?
По производительности одинаково, обе формы используют один и тот же поиск по хеш-таблице ключей. in menu короче и чаще встречается в коде.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)