Какой лучший способ расширить словарь с другим? Например:
>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}
Я ищу любую операцию, чтобы получить этот избегающий for
цикл:
{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
Я хочу сделать что-то вроде:
a.extend(b) # This does not work
python
dictionary
FerranB
источник
источник
Ответы:
Последняя документация стандартной библиотеки Python
источник
{"a":2, "b":3}
с помощью dict{"b":4, "c":5}
to dict{"a":2, "b":3,"c":5}
? Конечно, это можно использоватьupdate()
, перемещая некоторые вещи, но было бы лучше, если бы это можно было сделать только в одной строке ...update
молча перезаписывает существующие записи. То есть любые значения вb
перезаписывают значенияa
для перекрывающихся ключей.Красивая жемчужина в этом закрытом вопросе :
«Единый путь», не изменяющий ни один из входных диктов,
Узнайте, что
**basket_two
(здесь**
) означает здесь .В случае конфликта элементы из
basket_two
будут отменять те изbasket_one
. Что касается однострочников, то это довольно читабельно и прозрачно, и у меня нет никаких сложностей против того, чтобы использовать его в любое время, когда пригодится изречение, представляющее собой смесь двух других (любой читатель, который испытывает затруднения в понимании этого, на самом деле будет очень хорошо способ, которым это побуждает его или ее к изучениюdict
и**
форме ;-). Так, например, используется как:достаточно частые случаи в моем коде.
Первоначально представленный Алекс Мартелли
Примечание: в Python 3 это будет работать, только если каждый ключ в basket_two - это
string
.источник
dict
легко найти, хотя**
это немного сложнее (ключевое слово kwargs ). Вот хорошее объяснение: saltycrane.com/blog/2008/01/…basket_one.update(<dict>)
как , как следует из названия, обновляет существующий словарь (или клонированный).**anotherdict
должны быть строками.Вы пробовали использовать словарное понимание со словарным отображением:
Другой способ сделать это - использовать dict (iterable, ** kwarg)
В Python 3.9 вы можете добавить два dict, используя union | оператор
источник
Добавит ключи и значения от b к a , перезаписывая, если уже есть значение для ключа.
источник
Как уже упоминали другие,
a.update(b)
для некоторых диктовa
иb
будет достигнут результат, который вы просили в своем вопросе. Тем не менее, я хочу отметить, что я много раз виделextend
способ отображения / набор объектов , которые желают в синтаксисеa.extend(b)
,a
«s значения не должны быть перезаписаныb
» значениями s.a.update(b)
перезаписываетa
значения, и поэтому не является хорошим выбором дляextend
.Обратите внимание, что некоторые языки вызывают этот метод
defaults
илиinject
, как его можно представить, как способ ввода значений b (которые могут быть набором значений по умолчанию) в словарь без перезаписи значений, которые могут уже существовать.Конечно, вы можете просто заметить, что
a.extend(b)
это почти так же, какb.update(a); a=b
. Чтобы удалить назначение, вы можете сделать это так:Спасибо Тому Лису за эту умную идею, использующую конструктор без побочных эффектов
dict
дляextend
.источник
Вы также можете использовать коллекции python.Chainmap, который был представлен в python 3.3.
Это имеет несколько возможных преимуществ, в зависимости от вашего варианта использования. Они объяснены более подробно здесь , но я дам краткий обзор:
Это в основном делает его полезным для таких вещей, как словари конфигурации.
источник
Если вам это нужно как классу , вы можете расширить его с помощью dict и использовать update метод :
источник