Глава 11 · Очень много информации!
Методы словарей
pop, update, setdefault и представления keys/values/items — инструменты, без которых не обходится ни один реальный словарь.
pop() и popitem()
dict_pop.py
student = {"name": "Cartesian", "age": 13, "grade": "7 класс"}
age = student.pop("age")
print(student, age) # {'name': 'Cartesian', 'grade': '7 класс'} 13
dict_popitem.py
last_pair = student.popitem()
print(last_pair) # ('grade', '7 класс') — последняя добавленная пара
pop() у словаря — по ключу, не по позиции
В отличие от
list.pop(index), у словаря .pop(key) принимает КЛЮЧ, а не числовую позицию — позиций у словаря просто нет. Можно передать значение по умолчанию вторым аргументом, если ключа может не быть: student.pop("phone", None).update() — слить несколько пар сразу
dict_update.py
student = {"name": "Cartesian", "age": 13}
student.update({"age": 14, "city": "Москва"})
print(student) # age заменился, city добавился
setdefault() — добавить значение, только если ключа ещё нет
setdefault.py
counts = {}
word = "python"
counts.setdefault(word, 0)
counts[word] += 1
print(counts) # {'python': 1}
setdefault() = «если ключа нет — создай со значением по умолчанию»
counts.setdefault(word, 0) ничего не делает, если word уже есть в словаре, и создаёт запись со значением 0, если ключа не было — в обоих случаях после вызова можно смело писать counts[word] += 1. Полный алгоритм подсчёта частоты слов с таким подходом — в §11.24.keys(), values(), items() — не обычные списки
keys_values_items.py
student = {"name": "Cartesian", "age": 13}
print(student.keys()) # dict_keys(['name', 'age'])
print(student.values()) # dict_values(['Cartesian', 13])
print(student.items()) # dict_items([('name', 'Cartesian'), ('age', 13)])
Это «живые» представления, а не списки
.keys(), .values() и .items() возвращают объекты-представления (dict_keys и т.д.) — они отражают словарь в реальном времени. Для перебора циклом это не важно, но если нужен именно список, оберните в list(student.keys()).Порядок словаря
Современный Python сохраняет порядок вставки
Начиная с Python 3.7 порядок пар в словаре гарантированно совпадает с порядком, в котором их добавили — это официальная гарантия языка, а не случайность реализации. Но словарь остаётся отображением (доступ по ключу), а не позиционной коллекцией — не стоит писать код, который полагается на числовые позиции словаря.
Проверка in — только по ключам
membership_dict.py
student = {"name": "Cartesian", "age": 13}
print("name" in student) # True — есть такой КЛЮЧ
print("Cartesian" in student) # False — это значение, не ключ!
print("Cartesian" in student.values()) # True — а вот так корректно проверить значение
in у словаря проверяет ключи, а не значения
Частая ошибка новичка:
value in my_dict проверяет, есть ли value среди КЛЮЧЕЙ. Чтобы проверить значения, нужно явно написать value in my_dict.values().Ключи словаря тоже должны быть хешируемыми
hashable_keys.py
{["x", "y"]: 1}
# TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
Тот же принцип хешируемости из §11.16 — список нельзя использовать как ключ словаря по той же причине, по которой его нельзя положить в множество.
Практика: pop, update, setdefault, keys/values/items
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки