W3docs

Python словари: изменение ключей и значений

Узнайте, как изменять значения словаря, переименовывать ключи и обновлять элементы в Python с помощью присваивания, pop() и update().

Словари Python позволяют хранить данные в виде пар ключ-значение и свободно изменять их после создания. В этой главе рассматриваются все практические способы изменения существующих элементов словаря: изменение одного значения, переименование ключа, массовое обновление с помощью update() и работа с вложенными словарями, включая граничные случаи, которые встречаются в реальном коде.

Общие сведения о работе словарей см. в главе Доступ к элементам словаря. Чтобы добавить новые записи, см. главу Добавление элементов словаря. Чтобы удалить записи, см. главу Удаление элементов словаря.

Изменение значения

Простейшая модификация — это переназначение значения, хранящегося под существующим ключом. Используйте ключ в качестве индекса в левой части присваивания:

python— editable, runs on the server

Если ключ уже существует, его значение перезаписывается на месте. Остальные записи не затрагиваются, и словарь сохраняет порядок вставки (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() выполняет оба действия в одном выражении:

python— editable, runs on the server

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

Изменение и ключа, и значения одновременно

Совместите шаблон переименования с переназначением значения, чтобы изменить оба сразу:

python— editable, runs on the server

Или объедините это в один шаг, напрямую присвоив нужное значение вместо извлечённого:

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}

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

Практика

Практика
In Python, how can you change the items in a list?
In Python, how can you change the items in a list?
Was this page helpful?