C'est vrai, bien que cela se fond dans un dict de listes.
Katriel
1
c'est une liste et non un dict: >>> type ([{'a': 1}, {'b': 2}]) <type 'list'>
killown
Il devrait vraiment y avoir une seule ligne pour cela compte tenu de la fréquence à laquelle cela se produit. Y a-t-il une raison pour laquelle {** d pour d dans d_list} n'est pas pris en charge?
markemus le
Réponses:
164
Cela fonctionne pour les dictionnaires de toute longueur:
>>> result ={}>>>for d in L:... result.update(d)...>>> result
{'a':1,'c':1,'b':2,'d':2}
Petite amélioration pour la réponse @dietbuddha avec le déballage du dictionnaire de PEP 448 , pour moi, c'est plus lisible de cette façon, aussi, c'est plus rapide aussi :
from functools import reduce
result_dict = reduce(lambda a, b:{**a,**b}, list_of_dicts)
Mais gardez à l'esprit que cela ne fonctionne qu'avec les versions Python 3.5+.
>>> 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 deuxième paire clé / valeur au dernier dictionnaire pour montrer qu'il fonctionne avec plusieurs entrées. Les clés des dictionnaires plus loin dans la liste écraseront également la même clé d'un dict précédent.
Réponses:
Cela fonctionne pour les dictionnaires de toute longueur:
En guise de compréhension :
la source
Dans le cas de Python 3.3+, il existe une
ChainMap
collection :Regarde aussi:
la source
Remarque: l'ordre de 'b' et 'c' ne correspond pas à votre sortie car les dictionnaires ne sont pas ordonnés
si les dictats peuvent avoir plus d'une clé / valeur
la source
Pour les dictionnaires plats, vous pouvez le faire:
la source
Ceci est similaire à @delnan mais offre la possibilité de modifier les éléments k / v (clé / valeur) et je pense que c'est plus lisible:
par exemple, remplacez k / v elems comme suit:
décompresse le tuple k, v du générateur de dictionnaire .items () après avoir sorti l'objet dict de la liste
la source
Ceci est asymétrique car vous devez choisir quoi faire avec les clés en double; dans ce cas,
dict2
écraseradict1
. Échangez-les contre l'autre.EDIT: Ah, désolé, je n'ai pas vu ça.
Il est possible de le faire en une seule expression:
Aucun crédit à moi pour ce dernier!
Cependant, je dirais qu'il pourrait être plus pythonique (explicite> implicite, plat> imbriqué) de le faire avec une simple
for
boucle. YMMV.la source
Vous pouvez utiliser se joindre à la fonction de funcy bibliothèque:
la source
Petite amélioration pour la réponse @dietbuddha avec le déballage du dictionnaire de PEP 448 , pour moi, c'est plus lisible de cette façon, aussi, c'est plus rapide aussi :
Mais gardez à l'esprit que cela ne fonctionne qu'avec les versions Python 3.5+.
la source
Remarque J'ai ajouté une deuxième paire clé / valeur au dernier dictionnaire pour montrer qu'il fonctionne avec plusieurs entrées. Les clés des dictionnaires plus loin dans la liste écraseront également la même clé d'un dict précédent.
la source
dic1 = {'Maria': 12, 'Paco': 22, 'Jose': 23} dic2 = {'Patricia': 25, 'Marcos': 22 'Tomas': 36}
dic2 = dict (dic1.items () + dic2.items ())
et ce sera le résultat:
dic2 {'Jose': 23, 'Marcos': 22, 'Patricia': 25, 'Tomas': 36, 'Paco': 22, 'Maria': 12}
la source