Добавление в словарь Python: только при отсутствии ключа
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для добавления ключа в словарь, если вы не уверены, существует ли он, можно использовать метод dict.setdefault(key, default)
. Этот метод 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'
— сохраняющим своё старое значение ключом.
Методы безопасного обновления словаря
Оператор объединения в Python 3.9+
Если у вас Python 3.9 или более поздняя версия, используйте оператор объединения (|
). Он позволит объединить два словаря, при этом сохраняя существующие значения.
my_dict = {'a': 1, 'b': 2}
new_entries = {'b': 3, 'c': 4}
my_dict = new_entries | my_dict # 'b': 2 сохранится, так как имеет приоритет.
Распаковка словарей
Распаковка словаря с использованием оператора **
весьма удобна для объединения нескольких ключей и установления для них значений по умолчанию.
defaults = {'a': 1, 'b': 2}
updated_dict = {**defaults, **my_dict} # Компактное обновление словаря с приоритетом значений из my_dict.
Условное обновление через if
Не забывайте использовать добрый старый if
, если перед добавлением ключа в словарь требуется проверить его наличие.
if 'c' not in my_dict:
my_dict['c'] = 3 # 'c' добавляется в словарь.
Использование .get()
Метод .get()
предохраняет от ошибки KeyError
, устанавливая значение по умолчанию, если ключ отсутствует.
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()
для объединения словарей и задания значений по умолчанию. Не позволяйте версии языка встать на пути вашего кода.
my_dict.update({k: defaults[k] for k in defaults if k not in my_dict}) # Отличный метод для Python 3.8 и ниже!
defaultdict для установки значения по умолчанию
collections.defaultdict
в Python автоматически присваивает значения по умолчанию отсутствующим ключам при обращении к ним.
from collections import defaultdict
my_dict = defaultdict(lambda: 'default', my_dict) # Нет такого ключа? Не проблема!
Визуализация
Представим словарь как парковку:
🅿️ Места на парковке (Dict): [Место1: 'Авто', Место2: 'Грузовик']
Добавим туда 'Мотоцикл', но только если Место3 свободно.
parking_lot.setdefault('Slot3', 'Motorbike')
До: 🅿️[Место1: 🚗, Место2: 🚚] После: 🅿️[Место1: 🚗, Место2: 🚚, Место3: 🏍️]
Точно так же, как место займёт 'Мотоцикл', только если оно свободно, метод .setdefault()
добавляет пару ключ-значение, лишь если ключ не существует в словаре.
Подход к обновлению словаря на дистанции
Читаемость — наше всё
Не стоит принижать значение читаемости кода, даже ради его сокращения. Всё-таки, мы пишем код для людей, а не ради скорости выполнения.
Большие данные требуют вдумчивых решений
При работе с большими данными необходимо учитывать время выполнения различных методов обновления. Забота о производительности сегодня может избавить от проблем в будущем.
Будьте в тренде с Python
Следите за новыми релизами Python: ваши навыки работы со словарями только улучшатся. Будьте в курсе последних обновлений!
Полезные материалы
- Built-in Types — Python 3.12.2 документация — подробности о методе
setdefault
в словарях Python. - PEP 448 – Дополнительные возможности распаковки — обсуждение методов объединения словарей в Python 3.5 и выше.
- collections — контейнеры в типах данных — информация об использовании
collections.defaultdict
в Python. - PEP 0 – Индекс предложений об улучшении Python — информационный ресурс предложений по улучшению Python (PEP).
- Новейшие вопросы с тегом 'python+dictionary' – Stack Overflow — обсуждения и Q&A на тему словарей Python.
- Built-in Types — Python 3.12.2 документация — информация об объектах представления словарей Python.
- Python – Словарь — вводная статья про словари в Python и способы их использования.