2009-11-23 3 views

Répondre

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

alternativement (et soi-disant plus rapide):

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

question précédente SO que ces deux réponses venaient de se here.

+0

Au lieu de 'd4 = dict (d1) 'on pourrait utiliser' d4 = copier (d1) '. –

+1

@ds: Cela ne semble pas fonctionner. Peut-être que vous vouliez dire 'copie d'importation de copie; d4 = copier (d1) 'ou peut-être' d4 = d1.copy() '. –

+8

La première version ne fonctionne pas sur Python3. – Superbest

30

Vous pouvez utiliser la méthode update() pour construire un nouveau dictionnaire contenant tous les éléments:

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

Ou, dans une boucle:

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

ne construit pas un nouveau dictionnaire. Il (comme prévu) met à jour l'original. –

+3

@ A.J.Rouvoet: "L'original" dans ce cas est un tout nouveau dictionnaire vide dans 'dall'. Ce nouveau dictionnaire est mis à jour à plusieurs reprises pour contenir tous les éléments. C'est intentionnel que 'dall' est changé. – sth

+0

Ah, mon commentaire était purement sur la façon dont vous avez formulé la première phrase. Il a suggéré quelque chose qui n'est pas le cas. Même si j'admets que le vote négatif a pu être un peu dur. –

186
  1. et Slowest ne fonctionne pas dans Python3: concaténer le items et appeler dict dans la liste qui en résulte:

    $ 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. le plus rapide: exploiter le constructeur dict à fond, puis un 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. Middling: une boucle de update appels sur un dict initialement vide:

    $ 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. Ou , de manière équivalente, une copie-ctor et deux mises à jour:

    $ 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 
    

Je recommande l'approche (2), et je recommande particulièrement d'éviter (1) (qui prend également O (N) mémoire auxiliaire supplémentaire pour la liste concaténée des éléments de structure de données temporaires).

+6

Je ne comprends pas pourquoi 'd4 = dict (d1, ** dict (d2, ** d3))' n'est pas plus rapide que # 2, mais ce n'est pas le cas. –

+13

1 ci-dessus est préférable si vous travaillez sur de petits dicts car il est plus clair à mon avis. – Baz

+3

Je suis tombé sur ce fil et j'obtiens des résultats plus rapides de ~ 0.2 usec en utilisant 'd4 = d1.copy(); d4.update (d2, ** d3) 'que' d4 = dict (d1, ** d2); d4.update (d3) '. Je sais que c'est vieux mais je pensais poster mes résultats. –

9

est ici un one-liner (imports ne compte pas :) qui peut facilement être généralisé à concaténer dictionnaires N, Python 2.6+:

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

Sortie:

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

Généralisée à concaténer N dicts:

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

Je suis un peu en retard à cette fête, je sais, mais je ope cela aide quelqu'un.

+0

' imports' * do * count. mais la solution ici est toujours intéressante: – javadba

+0

pour python 3.6 cela devrait être 'd.items()' au lieu de 'd.iteritems()'. merci pour votre contribution! –

18

utiliser le constructeur 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)) 

En fonction

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

La surcharge de créer des dictionnaires intermédiaires peut être éliminé en utilisant la méthode dict.update():

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