27 votes

Fusion des dictionnaires Python

Je essaie de fusionner les dictionnaires Python suivants comme suit :

dict1= {'paul':100, 'john':80, 'ted':34, 'herve':10}
dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}

output = {'paul':[100,'a'],
          'john':[80, 'b'],
          'ted':[34,'c'],
          'peter':[None, 'd'],
          'herve':[10, None]}

Je souhaite conserver toutes les clés des deux dictionnaires.
Y a-t-il un moyen efficace de le faire ?

22voto

Alex Martelli Points 330805
output = {k: [dict1[k], dict2.get(k)] for k in dict1}
output.update({k: [None, dict2[k]] for k in dict2 if k not in dict1})

17voto

Nadia Alramli Points 40381

Cela fonctionnera :

{k: [dict1.get(k), dict2.get(k)] for k in set(dict1.keys() + dict2.keys())}

Sortie :

{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}

9voto

gnibbler Points 103484

En Python2.7 ou Python3.1, vous pouvez facilement généraliser pour travailler avec n'importe quel nombre de dictionnaires en utilisant une combinaison de listes, ensembles et compréhensions de dictionnaires !

>>> dict1 = {'paul':100, 'john':80, 'ted':34, 'herve':10}
>>> dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}
>>> dicts = dict1,dict2
>>> {k:[d.get(k) for d in dicts] for k in {k for d in dicts for k in d}}
{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}

Python2.6 n'a pas de compréhensions d'ensemble ou de dictionnaire

>>> dict1 = {'paul':100, 'john':80, 'ted':34, 'herve':10}
>>> dict2 = {'paul':'a', 'john':'b', 'ted':'c', 'peter':'d'}
>>> dicts = dict1,dict2
>>> dict((k,[d.get(k) for d in dicts]) for k in set(k for d in dicts for k in d))
{'john': [80, 'b'], 'paul': [100, 'a'], 'peter': [None, 'd'], 'ted': [34, 'c'], 'herve': [10, None]}

2voto

asdfg Points 491

En Python3.1,

output = {k:[dict1.get(k),dict2.get(k)] for k in dict1.keys() | dict2.keys()}

En Python2.6,

output = dict((k,[dict1.get(k),dict2.get(k)]) for k in set(dict1.keys() + dict2.keys()))

1voto

Itamar Mushkin Points 1441

En utilisant chain.from_iterable (from itertools) vous pouvez éviter la compréhension de liste/dictionnaire/ensemble avec :

dict(chain.from_iterable(map(lambda d: d.items(), list_of_dicts])))

Cela peut être plus ou moins pratique et lisible que la double compréhension, selon vos préférences personnelles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X