как объединить два словаря для создания нового в 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} 

5 Solutions collect form web for “как объединить два словаря для создания нового в Python?”

  1. самый медленный: объедините 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 
  2. 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 
  3. middleling: цикл 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 
  4. или, что то же самое, один экземпляр-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) для конкатенированного списка временных структур данных элементов).

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

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

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

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

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

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

Или, в цикле:

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

Используйте конструктор 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), {}) 

Вот один лайнер ( 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)) 

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

Python - лучший язык программирования в мире.