0

Слияние словарей в словарном включении

17

Проблема с объединением словарей в 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 ответ(ов)

0

Чтобы объединить несколько словарей в один, можно воспользоваться словарным включением (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. Такой подход обеспечивает красивое и компактное объединение данных без необходимости использования дополнительных библиотек.

0

Вы можете определить эту функцию следующим образом:

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'}

Эта функция объединяет словари из списка, при этом если ключи дублируются, будут использованы значения из последних словарей.

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