Python словари: изменение ключей и значений
Узнайте, как изменять значения словаря, переименовывать ключи и обновлять элементы в Python с помощью присваивания, pop() и update().
Словари Python позволяют хранить данные в виде пар ключ-значение и свободно изменять их после создания. В этой главе рассматриваются все практические способы изменения существующих элементов словаря: изменение одного значения, переименование ключа, массовое обновление с помощью update() и работа с вложенными словарями, включая граничные случаи, которые встречаются в реальном коде.
Общие сведения о работе словарей см. в главе Доступ к элементам словаря. Чтобы добавить новые записи, см. главу Добавление элементов словаря. Чтобы удалить записи, см. главу Удаление элементов словаря.
Изменение значения
Простейшая модификация — это переназначение значения, хранящегося под существующим ключом. Используйте ключ в качестве индекса в левой части присваивания:
Если ключ уже существует, его значение перезаписывается на месте. Остальные записи не затрагиваются, и словарь сохраняет порядок вставки (Python 3.7+).
Что происходит, если ключ не существует?
Если вы используете присваивание с ключом, которого нет в словаре, Python тихо создаёт новую запись вместо того, чтобы вызвать ошибку:
prices = {'apple': 1.00, 'banana': 0.50}
prices['mango'] = 2.50 # 'mango' did not exist — a new entry is created
print(prices)
# {'apple': 1.00, 'banana': 0.50, 'mango': 2.50}Если вы хотите обновить значение только при условии, что ключ существует, сначала проверьте с помощью in:
if 'banana' in prices:
prices['banana'] = 0.75Массовое обновление с помощью update()
dict.update() позволяет изменить несколько значений сразу. Передайте ему словарь (или именованные аргументы) с парами ключ-значение для применения:
inventory = {'apple': 10, 'banana': 5, 'orange': 8}
inventory.update({'banana': 12, 'orange': 3})
print(inventory)
# {'apple': 10, 'banana': 12, 'orange': 3}Ключи, присутствующие в аргументе, перезаписывают существующие значения; ключи, которые не упомянуты, остаются без изменений. Можно также передавать именованные аргументы напрямую:
inventory.update(apple=20, banana=15)
print(inventory)
# {'apple': 20, 'banana': 15, 'orange': 3}update() также добавляет ключи из аргумента, которых ещё нет в целевом словаре, что делает его удобным инструментом для слияния двух словарей.
Переименование (изменение) ключа
Ключи словаря являются неизменяемыми ссылками — переименовать ключ напрямую невозможно. Стандартный подход — добавить новый ключ со старым значением и удалить старый ключ. Метод pop() выполняет оба действия в одном выражении:
pop('banana') возвращает 2 и удаляет запись 'banana'. Присвоение этого возвращаемого значения my_dict['pear'] создаёт переименованную запись.
Обратите внимание, что переименованный ключ появляется в конце словаря, а не на исходной позиции 'banana', поскольку это новый вставляемый ключ.
Переименование ключа, когда вы не уверены в его существовании
Если ключ может отсутствовать, pop() вызовет KeyError. Передайте значение по умолчанию вторым аргументом, чтобы избежать исключения:
value = my_dict.pop('grape', None) # returns None if 'grape' is missing
if value is not None:
my_dict['kiwi'] = valueИзменение и ключа, и значения одновременно
Совместите шаблон переименования с переназначением значения, чтобы изменить оба сразу:
Или объедините это в один шаг, напрямую присвоив нужное значение вместо извлечённого:
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
my_dict.pop('banana') # remove old key (discard value)
my_dict['pear'] = 4 # insert new key with new value
print(my_dict)
# {'apple': 1, 'orange': 3, 'pear': 4}Обновление элементов во вложенном словаре
Когда словарь содержит другие словари в качестве значений, используйте цепочку индексов для обращения к внутреннему значению:
catalog = {
'apple': {'price': 1.00, 'stock': 50},
'banana': {'price': 0.50, 'stock': 30},
}
# Update only the price of 'banana'
catalog['banana']['price'] = 0.75
print(catalog['banana'])
# {'price': 0.75, 'stock': 30}Можно также вызвать update() на внутреннем словаре:
catalog['apple'].update({'price': 1.20, 'stock': 45})
print(catalog['apple'])
# {'price': 1.20, 'stock': 45}Типичные ошибки
| Ситуация | Что происходит | Решение |
|---|---|---|
| Присваивание несуществующему ключу | Создаётся новая запись (без ошибки) | Сначала проверьте if key in d, если хотите только обновить |
Вызов pop() для несуществующего ключа | Вызывается KeyError | Используйте d.pop(key, default) |
| Переименование сохраняет исходную позицию | Новый ключ оказывается в конце | Если порядок важен, перестройте словарь с помощью генератора словаря |
update() с перекрывающимися ключами | Тихо перезаписывает | Это намеренно — такова цель update() |
Перестройка словаря для сохранения порядка ключей
Если нужно, чтобы переименованный ключ остался на исходной позиции, перестройте словарь с помощью генератора:
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
my_dict = {
('pear' if k == 'banana' else k): v
for k, v in my_dict.items()
}
print(my_dict)
# {'apple': 1, 'pear': 2, 'orange': 3}Это перебирает все существующие записи и подставляет переименованный ключ только там, где условие истинно, оставляя всё остальное без изменений.