Как объединить два словаря для создания нового в Python?

Скажем, у меня три слова

d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}

Как создать новый d4, который объединяет эти три словаря? то есть:.

d4={1:2,3:4,5:6,7:9,10:8,13:22}

Ответ 1

  • slowest: объедините items и вызовите dict в результирующем списке:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = dict(d1.items() + d2.items() + d3.items())'
    
    100000 loops, best of 3: 4.93 usec per loop
    
  • fastest: используйте конструктор dict для рукопожатия, затем один update:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = dict(d1, **d2); d4.update(d3)'
    
    1000000 loops, best of 3: 1.88 usec per loop
    
  • middling: цикл update вызывает исходно-пустой файл dict:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = {}' 'for d in (d1, d2, d3): d4.update(d)'
    
    100000 loops, best of 3: 2.67 usec per loop
    
  • или, что то же самое, один экземпляр-ctor и два обновления:

    $ python -mtimeit -s'd1={1:2,3:4}; d2={5:6,7:9}; d3={10:8,13:22}' \
    'd4 = dict(d1)' 'for d in (d2, d3): d4.update(d)'
    
    100000 loops, best of 3: 2.65 usec per loop
    

Я рекомендую подход (2), и я особенно рекомендую избегать (1) (который также занимает дополнительную вспомогательную память O (N) для конкатенированного списка элементов временной структуры данных).

Ответ 2

d4 = dict(d1.items() + d2.items() + d3.items())

альтернативно (и предположительно быстрее):

d4 = dict(d1)
d4.update(d2)
d4.update(d3)

Предыдущий вопрос SO о том, что оба этих ответа пришли из здесь.

Ответ 3

Вы можете использовать метод update() для создания нового словаря, содержащего все элементы:

dall = {}
dall.update(d1)
dall.update(d2)
dall.update(d3)

Или, в цикле:

dall = {}
for d in [d1, d2, d3]:
  dall.update(d)

Ответ 4

Используйте конструктор dict

d1={1:2,3:4}
d2={5:6,7:9}
d3={10:8,13:22}

d4 = reduce(lambda x,y: dict(x, **y), (d1, d2, d3))

Как функция

from functools import partial
dict_merge = partial(reduce, lambda a,b: dict(a, **b))

Накладные расходы на создание промежуточных словарей могут быть устранены с помощью метода dict.update():

from functools import reduce
def update(d, other): d.update(other); return d
d4 = reduce(update, (d1, d2, d3), {})

Ответ 5

Здесь однострочный (imports не учитывается:), который может быть легко обобщен для объединения N словарей, Python 2.6 +:

from itertools import chain
dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3))

Вывод:

>>> from itertools import chain
>>> d1={1:2,3:4}
>>> d2={5:6,7:9}
>>> d3={10:8,13:22}
>>> dict(chain.from_iterable(d.iteritems() for d in (d1, d2, d3)))
{1: 2, 3: 4, 5: 6, 7: 9, 10: 8, 13: 22}

Обобщены для объединения N dicts:

from itertools import chain
def dict_union(*args):
    return dict(chain.from_iterable(d.iteritems() for d in args))

Я немного опаздываю на эту вечеринку, я знаю, но я надеюсь, что это кому-то поможет.