2009-11-23 60 views

ответ

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

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

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

Предыдущая SO вопрос, что оба эти ответы пришли в here.

+0

Вместо 'd4 = dict (d1) 'можно использовать' d4 = copy (d1) '. –

+1

@ds: Это похоже на то, что не работает. Возможно, вы имели в виду 'копировать копию копии; d4 = copy (d1) 'или, возможно,' d4 ​​= d1.copy() '. –

+8

Первая версия не работает на Python3. – Superbest

30

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

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

Или, в цикле:

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

обновление не создает новый словарь. Он (как и ожидалось) обновляет исходный. –

+3

@ A.J.Rouvoet: «Оригинальный» в этом случае - совершенно новый пустой словарь в 'dall'. Этот новый словарь многократно обновляется, чтобы содержать все элементы. Это намеренно, что «dall» изменен. – sth

+0

Ах, мой комментарий был исключительно на том, как вы сформулировали первое предложение. Он предположил, что это не так. Хотя я допускаю, что подавляющее большинство голосов было довольно резким. –

186
  1. Slowest и не работает Python3: объединить 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. середнячок: петля 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. Or , один экземпляр-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) для конкатенированного списка элементов временной структуры данных).

+6

Я не понимаю, почему 'd4 = dict (d1, ** dict (d2, ** d3))' не быстрее, чем # 2, но это не так. –

+13

1 выше лучше всего, если работать над маленькими диктофонами, поскольку яснее, на мой взгляд. – Baz

+3

Просто наткнулся на эту тему, и я постоянно получаю ~ 0,2 мкс быстрее результатов, используя 'd4 = d1.copy(); d4.update (d2, ** d3) ', чем' d4 = dict (d1, ** d2); d4.update (d3) '. Я знаю, что это старо, но я думал, что опубликую свои результаты. –

9

Вот один вкладыш (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)) 

Я немного опоздал на эту вечеринку, я знаю, но я h Это помогает кому-то.

+0

' import' * do * count. но решение здесь по-прежнему интересно – javadba

+0

для python 3.6 оно должно быть 'd.items()' вместо 'd.iteritems()'. спасибо за ваш вклад! –

18

Используйте конструктор ДИКТ

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), {}) 
Смежные вопросы