Перебор словарей: 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) — ещё одним важным типом коллекции.