5

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

15

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

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

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

dest = # Здесь что-то с orig и extra

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

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

5 ответ(ов)

8

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

orig.update(extra)

Или, если вы не хотите модифицировать orig, сначала создайте его копию:

dest = dict(orig)  # или orig.copy()
dest.update(extra)

Обратите внимание, что если у extra и orig есть overlapping (пересекающиеся) ключи, то конечное значение будет взято из extra. Например:

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

Существует два способа добавления одного словаря в другой:

Обновление (модифицирует orig на месте)

orig.update(extra)    # Python 2.7+
orig |= extra         # Python 3.9+

Слияние (создает новый словарь)

# Python 2.7+
dest = collections.ChainMap(orig, extra)
dest = {k: v for d in (orig, extra) for (k, v) in d.items()}

# Python 3
dest = {**orig, **extra}          
dest = {**orig, 'D': 4, 'E': 5}

# Python 3.9+ 
dest = orig | extra

Предостережения

Обратите внимание, что эти операции некоммутативны. В любом случае второй словарь становится приоритетным. Например:

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

dest = orig | extra
# dest = {'A': 3, 'B': 2, 'C': 3}

dest = extra | orig
# dest = {'A': 1, 'B': 2, 'C': 3}

Также важно отметить, что только с Python 3.7 (и CPython 3.6) словари dict сохраняют порядок. В предыдущих версиях порядок элементов в словаре может варьироваться.

0

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

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

Или без использования itertools:

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

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

В качестве более общего примера, представьте, что у вас есть более крупный список словарей, которые вы хотите объединить в один словарь. Вы можете сделать что-то вроде этого:

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

Чтобы объединить два словаря в Python за три строки, вы можете использовать следующий код:

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

Этот код создает новый словарь dest, не изменяя при этом исходные словари orig и extra.

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

0

Метод .update() — это именно то, что вам нужно! 😃

update([other])

Метод обновляет словарь, добавляя пары ключ/значение из другого словаря (или из итерируемого объекта с парами ключ/значение), перезаписывая существующие ключи. Возвращает None.

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

Изменения в версии 2.4:

Метод был дополнен возможностью принимать итерируемый объект пар ключ/значение и поддерживает именованные аргументы.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь