comment concaténer deux dictionnaires pour en créer un nouveau en Python? [dupliquer]

cette question a déjà une réponse ici:

  • comment fusionner deux dictionnaires en une seule expression? 49 réponses

Dire que j'ai trois dicts

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

comment créer un nouveau d4 qui combine ces trois dictionnaires? c'est à dire:

d4={1:2,3:4,5:6,7:9,10:8,13:22}
153
demandé sur vcsjones 2009-11-23 10:23:32

5 réponses

  1. le plus lent et ne fonctionne pas en Python3: concaténez le items et appelez dict sur la liste résultante:

    $ 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 jusqu'au bout, 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. Médiocre: une boucle de update appels sur un initialement vide 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. Ou, de manière équivalente, un copier-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 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 d'éléments structure de données temporaire).

204
répondu Alex Martelli 2018-02-22 21:19:44
d4 = dict(d1.items() + d2.items() + d3.items())

alternativement (et prétendument plus rapide):

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

question précédente donc que ces deux réponses sont venues de est ici .

84
répondu Amber 2017-05-23 12:10:44

vous pouvez utiliser la méthode update() pour construire un nouveau dictionnaire contenant tous les articles:

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

ou, en boucle:

dall = {}
for d in [d1, d2, d3]:
  dall.update(d)
40
répondu sth 2009-11-23 07:30:25

utiliser le constructeur DCT

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

les frais généraux liés à la création de dictionnaires intermédiaires peuvent être éliminés 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), {})
19
répondu Shea Lafayette Valentine 2013-10-15 15:02:22

Voici une doublure ( imports don't count :) qui peut facilement être généralisée pour concaténer n dictionnaires:

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 pour concaténer N dicts:

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

Python 3

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

et:

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

je suis un peu en retard à cette fête, je sais, mais j'espère que cela aidera quelqu'un.

14
répondu ron rothman ℝℝ 2018-04-16 12:45:32