Добавить словарь в словарь
У меня есть два существующих словаря, и я хочу "добавить" один из них к другому. Я имею в виду, что ключи и значения второго словаря должны быть добавлены в первый словарь. Например:
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 ответ(ов)
Вы можете сделать так:
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}
Существует два способа добавления одного словаря в другой:
Обновление (модифицирует 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
сохраняют порядок. В предыдущих версиях порядок элементов в словаре может варьироваться.
Если вы не хотите изменять 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)))
Чтобы объединить два словаря в Python за три строки, вы можете использовать следующий код:
dest = {}
dest.update(orig)
dest.update(extra)
Этот код создает новый словарь dest
, не изменяя при этом исходные словари orig
и extra
.
Обратите внимание: если в orig
и extra
есть одинаковые ключи с разными значениями, то значение из extra
переопределит значение из orig
.
Метод .update()
— это именно то, что вам нужно! 😃
update([other])
Метод обновляет словарь, добавляя пары ключ/значение из другого словаря (или из итерируемого объекта с парами ключ/значение), перезаписывая существующие ключи. Возвращает None.
update()
принимает либо другой объект словаря, либо итерируемый объект пар ключ/значение (например, кортежи или другие итерируемые объекты длиной два). Если указаны именованные аргументы, словарь будет обновлён соответствующими парами ключ/значение, например: d.update(red=1, blue=2)
.
Изменения в версии 2.4:
Метод был дополнен возможностью принимать итерируемый объект пар ключ/значение и поддерживает именованные аргументы.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?