Перебор словарей: items, keys, values

Перебор словарей: items, keys, values

В предыдущем уроке мы создавали словари и работали с отдельными элементами. Теперь научимся перебирать словари — проходить по всем ключам, значениям или парам. Python предоставляет три специальных метода-представления для этого.

Три метода перебора

У каждого словаря есть три метода, возвращающих «представления» (view objects):

  • keys() — все ключи
  • values() — все значения
  • items() — все пары ключ-значение (как кортежи)
person = {"name": "Алиса", "age": 25, "city": "Москва"}

print(person.keys())    # dict_keys(['name', 'age', 'city'])
print(person.values())  # dict_values(['Алиса', 25, 'Москва'])
print(person.items())   # dict_items([('name', 'Алиса'), ('age', 25), ('city', 'Москва')])

Это не списки, а представления — динамически отражают текущее состояние словаря. Если словарь изменится, представление тоже изменится.

Перебор ключей

По умолчанию for d in dict перебирает ключи:

scores = {"Алиса": 92, "Борис": 85, "Вера": 97}

for name in scores:           # эквивалентно for name in scores.keys()
    print(name)

# Явно через keys():
for name in scores.keys():
    print(f"{name}: {scores[name]}")

Перебор значений

scores = {"Алиса": 92, "Борис": 85, "Вера": 97}

for score in scores.values():
    print(score)

total = sum(scores.values())
average = total / len(scores)
print(f"Средний балл: {average:.1f}")   # 91.3

Перебор пар: items()

items() — самый частый способ, когда нужны и ключ, и значение:

scores = {"Алиса": 92, "Борис": 85, "Вера": 97}

for name, score in scores.items():   # распаковка кортежа
    print(f"{name}: {score}")

Вывод:

Алиса: 92
Борис: 85
Вера: 97

Поиск в словаре

grades = {"Алиса": "A", "Борис": "B", "Вера": "A", "Гриша": "C"}

# Найти всех с оценкой "A":
top_students = [name for name, grade in grades.items() if grade == "A"]
print(top_students)   # ['Алиса', 'Вера']

# Подсчёт оценок:
count_a = sum(1 for g in grades.values() if g == "A")
print(count_a)   # 2

Практический пример: частотный словарь

Одна из классических задач — подсчитать, сколько раз встречается каждый символ (или слово):

text = "hello world"
freq = {}

for char in text:
    if char in freq:
        freq[char] += 1
    else:
        freq[char] = 1

print(freq)
# {'h': 1, 'e': 1, 'l': 3, 'o': 2, ' ': 1, 'w': 1, 'r': 1, 'd': 1}

Тот же результат через setdefault:

freq2 = {}
for char in text:
    freq2[char] = freq2.get(char, 0) + 1

Вложенные словари

Значением словаря может быть другой словарь:

students = {
    "Алиса": {"age": 20, "grade": "A"},
    "Борис": {"age": 22, "grade": "B"},
}

print(students["Алиса"]["grade"])   # A

for name, info in students.items():
    print(f"{name}: {info['age']} лет, оценка {info['grade']}")

Преобразование представлений в списки

Если нужен именно список — конвертируйте явно:

d = {"a": 1, "b": 2, "c": 3}

keys_list = list(d.keys())     # ['a', 'b', 'c']
values_list = list(d.values()) # [1, 2, 3]
items_list = list(d.items())   # [('a', 1), ('b', 2), ('c', 3)]

Слияние словарей

Python 3.9+ предлагает оператор | для слияния:

defaults = {"debug": False, "port": 8080, "host": "localhost"}
overrides = {"debug": True, "port": 9000}

config = defaults | overrides   # Python 3.9+
print(config)
# {'debug': True, 'port': 9000, 'host': 'localhost'}

Или через update():

config2 = {**defaults, **overrides}   # двойная распаковка (тоже Python 3.5+)

Проверь себя

Что выведет следующий код?

d = {"a": 1, "b": 2, "c": 3}
total = sum(v * 2 for v in d.values())
print(total)

d.values()[1, 2, 3]. Умноженные на 2: [2, 4, 6]. Сумма: 12.

Итог

  • keys() — представление ключей; values() — значений; items() — пар.
  • for k in d: — перебор ключей; for k, v in d.items(): — ключи и значения.
  • d.values() удобно с sum(), min(), max().
  • Частотный словарь через d.get(k, 0) + 1 — классический паттерн.
  • Вложенные словари: d["key1"]["key2"].
  • Слияние: d1 | d2 (Python 3.9+) или {**d1, **d2}.

В следующем уроке познакомимся с множествами (set) — ещё одним важным типом коллекции.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике