Добавление в словарь Python: только при отсутствии ключа

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для добавления ключа в словарь, если вы не уверены, существует ли он, можно использовать метод dict.setdefault(key, default). Этот метод Python добавит пару ключ-значение в случае, если она ещё не существует. Посмотрим на пример:

Python
Скопировать код
my_dict = {'a': 1, 'b': 2}
my_dict.setdefault('c', 3)  # Добавляется 'c': 3, так как 'c' не встречался ранее.
my_dict.setdefault('a', 4)  # 'a': 1 не изменится, так как 'a' уже существует в словаре!

Таким образом, мы знакомимся с 'c' — новым элементом и 'a' — сохраняющим своё старое значение ключом.

Кинга Идем в IT: пошаговый план для смены профессии

Методы безопасного обновления словаря

Оператор объединения в Python 3.9+

Если у вас Python 3.9 или более поздняя версия, используйте оператор объединения (|). Он позволит объединить два словаря, при этом сохраняя существующие значения.

Python
Скопировать код
my_dict = {'a': 1, 'b': 2}
new_entries = {'b': 3, 'c': 4}
my_dict = new_entries | my_dict  # 'b': 2 сохранится, так как имеет приоритет.

Распаковка словарей

Распаковка словаря с использованием оператора ** весьма удобна для объединения нескольких ключей и установления для них значений по умолчанию.

Python
Скопировать код
defaults = {'a': 1, 'b': 2}
updated_dict = {**defaults, **my_dict}  # Компактное обновление словаря с приоритетом значений из my_dict.

Условное обновление через if

Не забывайте использовать добрый старый if, если перед добавлением ключа в словарь требуется проверить его наличие.

Python
Скопировать код
if 'c' not in my_dict:
    my_dict['c'] = 3  # 'c' добавляется в словарь.

Использование .get()

Метод .get() предохраняет от ошибки KeyError, устанавливая значение по умолчанию, если ключ отсутствует.

Python
Скопировать код
my_dict['d'] = my_dict.get('d', 4)  # 'd' либо сохраняет своё текущее значение, либо устанавливает значение равное 4.

Берегите ваш словарь

Производительность на первом месте

Чем больше словарь, тем важнее использовать методы распаковки или оператора объединения: они позволяют сэкономить время и ресурсы.

Бонусы Python 3.9 для чистоты кода

Оператор объединения в Python 3.9 улучшает не только производительность, но и чистоту кода, сделав его более понятным и читабельным.

Читабельный код в стиле Python

Распаковка словарей и метод setdefault делают код более идиоматическим и читаемым.

Работа с краевыми случаями и особыми сценариями

Действуйте осторожно

Для преодоления "преграды" в виде несуществующего ключа, используйте in и setdefault. Это сделает ваш код более надёжным и понятным.

Стукий Python со старыми методами

Если вы используете версию ниже Python 3.9, воспользуйтесь dict.update() для объединения словарей и задания значений по умолчанию. Не позволяйте версии языка встать на пути вашего кода.

Python
Скопировать код
my_dict.update({k: defaults[k] for k in defaults if k not in my_dict})  # Отличный метод для Python 3.8 и ниже!

defaultdict для установки значения по умолчанию

collections.defaultdict в Python автоматически присваивает значения по умолчанию отсутствующим ключам при обращении к ним.

Python
Скопировать код
from collections import defaultdict

my_dict = defaultdict(lambda: 'default', my_dict)  # Нет такого ключа? Не проблема!

Визуализация

Представим словарь как парковку:

🅿️ Места на парковке (Dict): [Место1: 'Авто', Место2: 'Грузовик']

Добавим туда 'Мотоцикл', но только если Место3 свободно.

Python
Скопировать код
parking_lot.setdefault('Slot3', 'Motorbike')

До: 🅿️[Место1: 🚗, Место2: 🚚] После: 🅿️[Место1: 🚗, Место2: 🚚, Место3: 🏍️]

Точно так же, как место займёт 'Мотоцикл', только если оно свободно, метод .setdefault() добавляет пару ключ-значение, лишь если ключ не существует в словаре.

Подход к обновлению словаря на дистанции

Читаемость — наше всё

Не стоит принижать значение читаемости кода, даже ради его сокращения. Всё-таки, мы пишем код для людей, а не ради скорости выполнения.

Большие данные требуют вдумчивых решений

При работе с большими данными необходимо учитывать время выполнения различных методов обновления. Забота о производительности сегодня может избавить от проблем в будущем.

Будьте в тренде с Python

Следите за новыми релизами Python: ваши навыки работы со словарями только улучшатся. Будьте в курсе последних обновлений!

Полезные материалы

  1. Built-in Types — Python 3.12.2 документация — подробности о методе setdefault в словарях Python.
  2. PEP 448 – Дополнительные возможности распаковки — обсуждение методов объединения словарей в Python 3.5 и выше.
  3. collections — контейнеры в типах данных — информация об использовании collections.defaultdict в Python.
  4. PEP 0 – Индекс предложений об улучшении Python — информационный ресурс предложений по улучшению Python (PEP).
  5. Новейшие вопросы с тегом 'python+dictionary' – Stack Overflow — обсуждения и Q&A на тему словарей Python.
  6. Built-in Types — Python 3.12.2 документация — информация об объектах представления словарей Python.
  7. Python – Словарь — вводная статья про словари в Python и способы их использования.