Как обновить значение в словаре python
Перейти к содержимому

Как обновить значение в словаре python

  • автор:

Метод dict.update() в Python, обновление/дополнение словаря

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

Синтаксис:
dict.update([other]) # новое в Python 3.9 dict |= other 
Параметры:
  • dict — словарь, который необходимо обновить.
  • other — другой объект словаря или список пар (key, value) в виде кортежа.
Возвращаемое значение:
Описание:

Метод dict.update() обновляет/дополняет словарь dict с помощью пар ключ-значение из other , перезаписывая существующие ключи новыми значениями из other . Если ключ в словаре отсутствует, то он добавляется. Метод ничего не возвращает.

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

Метод dict.update() принимает либо другой объект словаря, либо итерируемую последовательность пар ключ/значение в виде кортежей или других итераций вида (key, value) .

Если заданы ключевые аргументы, то словарь обновляется с помощью следующих пар ключ/значение:

>>> x = 'yellow':0, 'red':2> >>> x.update(red=1, blue=2). >>> x #

Отличие операции обновления/дополнения словаря от операция объединения/слияния словарей заключается в том, что в результате операции объединения образуется новый словарь (исходные словари не изменяются), а при операции обновления/дополнения dict.update() изменяется исходный словарь dict .

Пример обновления/дополнения исходного словаря, ключами и значениями другого словаря:

>>> x = 'one': 10, 'two': 20, 'three': None> >>> y = 'three': 30, 'four': 40, 'five': 50> >>> x.update(y) >>> x # # новое в Python 3.9 >>> x |= y >>> x # >>> y = [('three', 3), ('four', 4), ('five', 5), ('six', 6)] >>> x.update(y) >>> x #
  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Представления словарей dict.keys, dict.values и dict.items
  • Исходный словарь для представления dictview.mapping
  • Получение списка ключей словаря list(dict)
  • Количество элементов в словаре len(dict)
  • Доступ к значению словаря по ключу dict[key]
  • Добавление/изменение значения словаря по ключу key
  • Удаление значения словаря по ключу
  • Проверка наличия/отсутствия ключа key в словаре dict
  • Проверка наличия/отсутствия значения value в словаре Python
  • Проверка наличия/отсутствия пары (key, value) в словаре dict
  • Итерирование по ключам и значениям словаря Python
  • Метод dict.clear(). Очистить словарь
  • Метод dict.copy(), копия словаря
  • Метод dict.fromkeys(), словарь с ключами по умолчанию
  • Метод dict.get(), значение по умолчанию если ключа нет
  • Метод dict.items(), список кортежей
  • Метод dict.keys(), список ключей словаря
  • Метод dict.values(), список значений словаря
  • Метод dict.pop()
  • Метод dict.popitem(), получить пару ключ/значение
  • Метод dict.setdefault(), получает/вставляет значение ключа
  • Метод dict.update(), обновление/дополнение словаря
  • Объединение двух словарей в новый словарь Python
  • Сортировка словаря по значению и/или ключу
  • Обратный порядок/реверс словаря reversed(dict)
  • Генератор словаря и его использование
  • Фильтр словаря по ключам и/или значениям
  • Словарь как фабрика функций

Изменение данных в словаре — Python: Cловари и множества

Словарь в Python — изменяемый или мутабельный. Но для добавления новой пары «ключ-значение» не нужны отдельные методы, вроде спискового метода .append — достаточно обычного присваивания:

d = <> # пустой словарь d["a"] = 100 print(d) # => d["b"] = 200 d["a"] = 0 print(d) # => 

Здесь вы можете увидеть, что присваивание значения новому ключу выглядит точно так же, как и присваивание существующему. Именно эту тему мы изучим подробнее в этом уроке

Метод pop

Удаление элементов из словаря можно сделать с помощью метода pop — в этом словарь уже больше похож на список. Только вместо индекса используется ключ:

d = 'a': 1, 'b': 2> d.pop('a') # 1 d # d.pop('BANG') # KeyError: 'BANG' 

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

Однако метод pop можно вызывать с указанием значения по умолчанию. В этом случае при отсутствии ключа в словаре будет возвращено это самое значение, а исключение возбуждено не будет:

d = 'a': 1, 'b': 2> d.pop('BANG', None) d.pop('BANG', 42) # 42 

Аналогом спискового pop без аргументов для словаря служит метод popitem . Этот метод извлекает ключ и значение в виде кортежа, а если словарь уже пуст, то возбуждает исключение:

d = 'a': 1> d.popitem() # ('a', 1) d.popitem() # KeyError: 'popitem(): dictionary is empty' 

В пайтоне, начиная с версии 3.7, гарантирован порядок LIFO — Last In First Out. Это значит, что пары будут извлекаться в порядке обратном добавлению, то есть последняя добавленная пара, будет извлечена первой. При этом мы можем быть уверены в том, что:

  • Все пары будут извлечены
  • Каждая пара будет извлечена строго один раз

Дополнение одного словаря другим

У списка есть метод extend , который расширяет один список другим. У словаря есть похожий по смыслу метод update . Но при вызове update ассоциированный объект словаря не просто получает пары «ключ-значение» из нового словаря. Происходит именно обновление данных — поэтому метод и называется update . Работает это так:

  • Новые ключи дописываются в словарь
  • Если какие-то ключи уже существовали до этого, то связанные с ними значения, будут заменены новыми

Так это выглядит в коде:

cart = 'apples': 2, 'oranges': 1> addon = 'oranges': 5, 'lemons': 3> cart.update(addon) cart # 

В коде выше мы добавили лимоны и обновили количество апельсинов.

Копирование словаря

В случае списков мы можем сложить два списка двумя способами:

  • Просто сложить два списка и получить новый
  • Сделать копию одного списка и дополнить ее данными из второго

Но словари нельзя складывать, да и срезы словари тоже не поддерживают. Зато у словаря есть метод copy . Он работает как копирование списка с помощью среза [:] — при вызове он возвращает поверхностную копию из словаря. Так же ее называют «неглубокой копией» или shallow copy.

Поверхностная копия воспроизводит только структуру словаря: не копирует значения, а только создает на них новые ссылки. Тем не менее поверхностная копия — это новый словарь, который может изменять свой состав, не влияя на оригинал:

d = 'a': 1, 'b': [42]> c = d.copy() c.update('a': 10, '1k': 1024>) c # c['b'].append(None) c # d # 

Словарь c получил собственную структуру, при этом его обновление не затронуло оригинальный словарь d . Однако изменение объекта списка по ссылке затронуло и оригинал, потому что при копировании словаря ссылка на список тоже скопировалась.

Очистка словаря

Списки можно очистить с помощью присваивания срезу l[:] = [] . В случае словаря вместо присваивания срезу используется метод clear .

Метод clear() удаляет все элементы из текущего словаря:

d = 'a': 1> 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Как обновлять словари с вложенными словарями?

Я знаю о методах update, или dict(a, **b), но мне нужно что бы сохранялись так же и вложенные данные.

Был бы рад получить ответ, или место куда стоит смотреть

  • Вопрос задан более года назад
  • 337 просмотров

6 комментариев

Простой 6 комментариев

phaggi

Алан Гибизов @phaggi Куратор тега Python
А где вложенный список-то?
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Нет у вас двух списков. Вообще списков нет в приведённом коде.
Илья @stead Автор вопроса

phaggi

Алан Гибизов @phaggi Куратор тега Python

Илья, трудно понять, что вы пытаетесь сделать. Приведите свой код, как вы пытались решить проблему, пусть не работающий, и опишите, с какими проблемами столкнулись.

Можно добавлять через + или через update, но там, куда добавляется, уже должен быть создан нужный вложенный уровень

a = > b = > updated=<> updated['a']=<> #или сразу updated=> updated['a']['a']=a['a']['a'] updated['a']['b']=b['a']['b'] print (updated) updated2=<> updated2['a']=<> updated2['a'].update(a['a']) updated2['a'].update(b['a']) print (updated2)

Илья @stead Автор вопроса

Алан Гибизов, я хочу сделать метод по типу dict.update()
Но хочу что бы поддерживались и вложенные словари.
По типу такого:

def extenct_dict(a : dict, b : dict) -> dict: # возвращаем a, которые обновили с помощью b + поддержка вложенных словарей return dict a = > b = , 'b' : 'value'> # , 'b' : value >

Решения вопроса 1
Илья @stead Автор вопроса

from collections.abc import Mapping def __deep_update(source : dict, overrides : dict): for key, value in overrides.items(): if isinstance(value, Mapping) and value: returned = __deep_update(source.get(key, <>), value) source[key] = returned else: source[key] = overrides[key] return source

Ответ написан более года назад
Комментировать
Нравится Комментировать
Ответы на вопрос 2

dimonchik2013

Dimonchik @dimonchik2013
non progredi est regredi

Я знаю о методах update, или dict(a, **b), но мне нужно что бы сохранялись так же и вложенные данные.

ну, осталось узнать о методе a[‘a’] = b

Обновление значения в словаре или сохранение множества словарей в одном словаре

Ребята, можете помочь с пониманием — сама не могу разобраться. Хочу сохранять информацию полученную от пользователя в один файл через Shelve по нескольким сферам деятельности: Спорт, Наука и т.д. У меня получается общий словарь с этими ключами, в которых должны быть значения в виде словарей. Вот так:

database['Спорт'] =

Потом я каждую категорию вытаскиваю в Treeview . Проблема в том, что я не понимаю, как обновлять именно ключ и добавлять в него несколько словарей. То есть пользователь вносит информацию — создаётся словарь и добавляется в существующий ключ. Помогите, как это возможно? То что есть сейчас — это все время замена уже существующего значения у ключа. Руки опускаются.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *