Слияние словарей в словарном включении
Проблема с объединением словарей в Python 3.5
В Python 3.5 мы можем объединять словари, используя двойное распаковку:
d1 = {1: 'one', 2: 'two'}
d2 = {3: 'three'}
result = {**d1, **d2}
# Результат: {1: 'one', 2: 'two', 3: 'three'}
Это удобно. Однако, похоже, данная методика не работает в динамических случаях:
ds = [d1, d2]
result = {**d for d in ds}
# Ошибка: SyntaxError: dict unpacking cannot be used in dict comprehension
Вместо этого приходится использовать более громоздкий вариант:
from functools import reduce
result = reduce(lambda x, y: {**x, **y}, ds, {})
Этот код выглядит менее привлекательно. Почему "один очевидный способ сделать это" недоступен в синтаксисе парсера, если в этом выражении не наблюдается никакой неоднозначности?
2 ответ(ов)
Чтобы объединить несколько словарей в один, можно воспользоваться словарным включением (dict comprehension), что является идиоматическим решением. Вместо использования ChainMap
мы можем просто использовать вложенный цикл для извлечения пар ключ-значение из каждого словаря. Вот пример:
d1 = {1: 'one', 2: 'two'}
d2 = {3: 'three'}
# Объединение словарей с помощью dict comprehension
result = {k: v for d in [d1, d2] for k, v in d.items()}
print(result) # Вывод: {1: 'one', 2: 'two', 3: 'three'}
Этот код создает новый словарь result
, где каждый ключ и значение берется из словарей d1
и d2
. Такой подход обеспечивает красивое и компактное объединение данных без необходимости использования дополнительных библиотек.
Вы можете определить эту функцию следующим образом:
from collections import ChainMap
def mergeDicts(l):
return dict(ChainMap(*reversed(list(l))))
После этого вы можете использовать ее следующим образом:
>>> d1 = {1: 'one', 2: 'two'}
>>> d2 = {3: 'three'}
>>> ds = [d1, d2]
>>> mergeDicts(ds)
{1: 'one', 2: 'two', 3: 'three'}
Эта функция объединяет словари из списка, при этом если ключи дублируются, будут использованы значения из последних словарей.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?