EDITComment fusionner une liste de dicts en une seule dict?
j'ai:
[{'a':1},{'b':2},{'c':1},{'d':2}]
la sortie doit être:
{'a':1,'b':2,'c':1,'d':2}
EDITComment fusionner une liste de dicts en une seule dict?
j'ai:
[{'a':1},{'b':2},{'c':1},{'d':2}]
la sortie doit être:
{'a':1,'b':2,'c':1,'d':2}
Cela fonctionne pour les dictionnaires de toute longueur:
>>> result = {}
>>> for d in L:
... result.update(d)
...
>>> result
{'a':1,'c':2,'b':1,'d':2}
Et comme générateur oneliner:
dict(pair for d in L for pair in d.items())
En Python 2.7 et 3.x cela peut et doit être écrite que la compréhension dict (merci, @katrielalex):
{ k: v for d in L for k, v in d.items() }
@Paul McGuire: J'espère sincèrement que l'utilisation appropriée des for-loops, des expressions de générateur et des builtins n'est pas considérée comme un génie (ou d'une manière exceptionnelle) parmi les programmeurs Python. Merci quand même :) – delnan
Ou même: '{k: v pour theDict dans lesDicts pour k, v dans theDict.items()}'! – katrielalex
@katrielalex: Je ** aime ** dict la compréhension! Mais je n'hésite pas à les inclure dans mes réponses, car ils ne sont que python 3 ... mais je vais l'inclure. – delnan
dict1.update(dict2)
Ceci est asymétrique parce que vous devez choisir quoi faire avec les clés en double; dans ce cas, dict2
remplacera dict1
. Échangez-les pour l'autre sens.
EDIT: Ah, désolé, je n'ai pas vu ça.
Il est possible de le faire en une seule expression:
>>> from itertools import chain
>>> dict(chain(*map(dict.items, theDicts)))
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
Aucun crédit à moi pour ce dernier!
Cependant, je dirais qu'il pourrait être plus Pythonic (explicite> implicite, plat> imbriqué) pour le faire avec une simple boucle for
. YMMV.
c'est une liste et non un dict: >>> type ([{ 'a': 1}, {'b': 2}])
>>> L=[{'a': 1}, {'b': 2}, {'c': 1}, {'d': 2}]
>>> dict(i.items()[0] for i in L)
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
Note: l'ordre de 'b' et 'c' ne correspond pas à votre sortie, car dicts ne sont pas organisées
si les dicts peuvent avoir plus d'une clé/valeur
>>> dict(j for i in L for j in i.items())
Echoue si l'un des dicts de la liste contient plus d'un élément. – PaulMcG
* toux * (en supposant que chaque dictionnaire ne contienne qu'une seule paire clé-valeur) * toux * – katrielalex
Ah, eh bien d'abord j'ai posté une méthode qui fonctionne avec les dicts généraux, mais il semblait que le PO n'en avait pas besoin –
>>> dictlist = [{'a':1},{'b':2},{'c':1},{'d':2, 'e':3}]
>>> dict(kv for d in dictlist for kv in d.iteritems())
{'a': 1, 'c': 1, 'b': 2, 'e': 3, 'd': 2}
>>>
Remarque J'ai ajouté une seconde paire clé/valeur à la dernier dictionnaire pour montrer qu'il fonctionne avec plusieurs entrées. Les clés des dicts plus tard dans la liste remplaceront la même clé d'une dict précédente.
Pour les dictionnaires plats que vous pouvez faire ceci:
from functools import reduce
reduce(lambda a, b: dict(a, **b), list_of_dicts)
dic1 = { 'Maria': 12, 'Paco': 22, 'Jose': 23} dic2 = {'Patricia': 25, 'Marcos': 22 'Tomas': 36}
dic2 = dict (dic1.items() + dic2.articles())
et ce sera le résultat:
dic2 { 'Jose': 23, 'Marcos': 22, 'Patricia': 25, 'Tomas': 36, 'Paco': 22, 'Maria': 12}
Dans le cas de Python 3.3+, il y a un ChainMap
collection:
>>> from collections import ChainMap
>>> a = [{'a':1},{'b':2},{'c':1},{'d':2}]
>>> dict(ChainMap(*a))
{'b': 2, 'c': 1, 'a': 1, 'd': 2}
voir aussi:
voir cette http://stackoverflow.com/questions/2365921/merging-python-dictionaries~~V~~singular~~3rd – shox
est vrai, bien que se fond dans un dict des listes. – katrielalex
c'est une liste et non un dict: >>> type ([{'a': 1}, {'b': 2}]) –
killown