Словарь - это таблица поиска
Списки индексируются позицией. Словари - ключом, обычно строкой или числом, и каждый ключ сопоставлен значению. Этот одинокий сдвиг открывает огромную категорию программ: инвентари, конфиги, 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] - когда отсутствие это баг.