Подтвердить что ты не робот

Добавить словарь в словарь?

У меня есть два существующих словаря, и я хочу "добавить" один из них к другому. Под этим я подразумеваю, что ключ, значения другого словаря должны быть внесены в первый словарь. Например:

orig = {
   'A': 1,
   'B': 2,
   'C': 3,
}

extra = {
   'D': 4,
   'E': 5,
}

dest = # something here involving orig and extra

print dest
{
   'A': 1,
   'B': 2,
   'C': 3,
   'D': 4,
   'E': 5
}

Я думаю, что все это может быть достигнуто с помощью цикла for (может быть?), но есть ли какой-нибудь метод словарей или любой другой модуль, который сохраняет эту работу для меня? Фактические словари, которые я использую, действительно большие...

4b9b3361

Ответ 1

Вы можете сделать

orig.update(extra)

или, если вы не хотите, чтобы orig был изменен, сначала сделайте копию:

dest = dict(orig)  # or orig.copy()
dest.update(extra)

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

>>> d1 = {1: 1, 2: 2}
>>> d2 = {2: 'ha!', 3: 3}
>>> d1.update(d2)
>>> d1
{1: 1, 2: 'ha!', 3: 3}

Ответ 2

Предполагая, что вы не хотите изменять orig, вы можете либо сделать копию и обновление, как и другие ответы, либо создать новый словарь за один шаг, передав все элементы из обоих словарей в конструктор dict:

from itertools import chain
dest = dict(chain(orig.items(), extra.items()))

Или без itertools:

dest = dict(list(orig.items()) + list(extra.items()))

Обратите внимание, что вам нужно только передать результат items() в list() на Python 3, на 2.x dict.items() уже возвращает список, чтобы вы могли просто сделать dict(orig.items() + extra.items()).

Как более общий вариант использования, скажем, у вас есть больший список dicts, который вы хотите объединить в один dict, вы можете сделать что-то вроде этого:

from itertools import chain
dest = dict(chain.from_iterable(map(dict.items, list_of_dicts)))

Ответ 3

Самый пифонический (и немного более быстрый) способ выполнить это:

dest = {**orig, **extra}

Или, в зависимости от решаемой проблемы, возможно:

dest = {**orig, 'D': 4, 'E': 5}

Ответ 4

dict.update() похоже, что он будет делать то, что вы хотите...

>> orig.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}
>>> 

Возможно, однако, вы не хотите обновлять свой оригинальный словарь, но работайте над копией:

>>> dest = orig.copy()
>>> dest.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2}
>>> dest
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}

Ответ 5

Существует метод .update():)

обновление ([другой])Обновите словарь с помощью пар ключ/значение из другого, перезаписав существующие ключи. Возврат Нет.

update() принимает либо другой объект словаря, либо итерабельность пар ключ/значение (в виде кортежей или других итераций длины два). Если аргументы ключевого слова, словарь затем обновляется с помощью эти пары ключ/значение: d.update(красный = 1, синий = 2).

Изменено в версии 2.4: разрешено аргумент быть итерабельным с парами ключ/значение и разрешенными аргументами ключевого слова.

Ответ 6

Ответ, который я хочу дать, это "use collections.ChainMap", но я только что обнаружил, что он был добавлен только в Python 3.3: https://docs.python.org/3.3/library/collections.html#chainmap-objects

Вы можете попытаться вырезать класс из источника 3.3: http://hg.python.org/cpython/file/3.3/Lib/collections/ init.py#l763

Ниже представлена ​​более полная версия Python 2.x(тот же автор): http://code.activestate.com/recipes/305268-chained-map-lookups/

Вместо того, чтобы расширять/перезаписывать один словарь другим, используя dict.merge, или создавать дополнительную копию, объединяющую оба, вы создаете цепочку поиска, которая выполняется как по порядку. Поскольку он не дублирует сопоставления, которые он обертывает, ChainMap использует очень мало памяти и видит более поздние модификации любого под-отображения. Поскольку вопросы порядка вы также можете использовать цепочку для выравнивания по умолчанию (например, пользовательские prefs > config > env).

Ответ 7

Три слота для объединения или слияния двух словарей:

dest = {}
dest.update(orig)
dest.update(extra)

Это создает новый словарь dest без изменения orig и extra.

Примечание. Если ключ имеет разные значения в orig и extra, то extra переопределяет orig.