Словарь — это таблица поиска
Списки индексируются позицией. Словари — ключом, обычно строкой или числом, и каждый ключ сопоставлен значению. Этот одинокий сдвиг открывает огромную категорию программ: инвентари, конфиги, JSON-пейлоады, профили пользователей, кэши.
Ключами и значениями может быть почти что угодно. Ключи должны быть хэшируемыми (значит: числа, строки, кортежи; не списки и не другие словари). Значения без ограничений — словарь может хранить что угодно, включая другие словари и списки.
Создание словарей
Несколько способов, у каждого своё место:
Чтение значений
Два способа, и выбор важен:
Выбирай по намерению:
[]— когда ключ обязан быть. Нет — это баг, и громкая ошибка тебе нужна..get()— когда «нет такого» — валидный случай. Позволяет задать значение по умолчанию без try/except.
Добавление, обновление, удаление
Присваивание по ключу создаёт либо обновляет:
update() объединяет с другим словарём или итерируемым парами:
Общие ключи из overrides перезаписывают те, что в settings.
Проверка ключа
in проверяет ключи, а не значения:
Чтобы проверить именно значение, используй user.values():
Как итерироваться по словарю
Тебе доступны три «вида», по которым можно крутить цикл:
.items() — то, за чем ты тянешься чаще всего: получаешь пару, уже распакованную, готовую к использованию.
Порядок итерации в современном Python (3.7+) совпадает с порядком вставки. Словарь — не «волшебный мешок»: добавишь a, потом b, потом c — итерация вернёт их в том же порядке. Это гарантия языка, на которую можно опираться.
Как отсортировать словарь
Словари сохраняют порядок вставки, так что «отсортировать» словарь на самом деле означает построить новый словарь с ключами, вставленными в нужном порядке:
sorted() возвращает список пар; обёртывание в dict(...) пересобирает словарь в новом порядке. Если нужны только отсортированные пары (а не словарь) — внешний dict() не пиши.
Как объединить два словаря
Python 3.9+ даёт оператор |:
При конфликте ключей побеждают значения из правого словаря. .update() — эквивалент на месте. На более старых версиях Python используй {**defaults, **overrides}.
Паттерн setdefault
Частая потребность: «если ключ есть — используй его значение; если нет — поставь значение по умолчанию и используй его».
Или, ещё лучше, используй collections.Counter:
Counter — это подкласс dict, который по умолчанию считает. Правильный выбор, когда считаешь вхождения.
Включения словарей
Параллель спискового включения, но для построения словарей:
Правила те же, что у списковых включений, но между фигурными — key: value.
Словарь — близнец JSON
Словари Python почти один в один ложатся на объекты JSON. Преобразование — один вызов:
Поэтому словари мелькают по всей веб-работе: твои запросы и ответы API — это по сути манипуляции словарями с сетью в середине.
Практический пример
Крошечная программа-конфиг, отслеживающая профиль пользователя:
Вложенные словари, изменяемые значения, .get() со значением по умолчанию — базовый набор для любых данных в виде записей.
Двигаемся дальше
Списки, кортежи, множества, словари. Имея эти четыре коллекции, можно смоделировать почти любые данные, с которыми столкнёшься поначалу. Дальше — списковое включение, компактный способ Python превращать одну коллекцию в другую.
Часто задаваемые вопросы
Что такое словарь в Python?
Словарь — это коллекция пар ключ-значение. Значение ищется по ключу: prices['apple'] вместо prices[0]. Словари быстро читаются и записываются, ключи должны быть уникальны, а в современном Python они сохраняют порядок вставки.
Как добавить ключ в словарь Python?
Просто присвой значение: my_dict['new_key'] = 'new value'. Если ключ уже есть, значение перезаписывается. Если нет — добавляется. Различия между «вставить» и «обновить» нет — синтаксис тот же.
В чём разница между dict[key] и dict.get(key)?
dict[key] поднимает KeyError, если ключа нет. dict.get(key) вместо этого возвращает None (или твоё значение по умолчанию). Используй .get(), когда отсутствие ключа — нормальная ситуация; [key] — когда отсутствие это баг.