2010-08-16 7 views

Répondre

85

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() } 
+1

@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

+4

Ou même: '{k: v pour theDict dans lesDicts pour k, v dans theDict.items()}'! – katrielalex

+0

@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

1
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.

+1

c'est une liste et non un dict: >>> type ([{ 'a': 1}, {'b': 2}]) killown

5
>>> 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()) 
+0

Echoue si l'un des dicts de la liste contient plus d'un élément. – PaulMcG

+0

* toux * (en supposant que chaque dictionnaire ne contienne qu'une seule paire clé-valeur) * toux * – katrielalex

+0

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 –

1
>>> 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.

3

Pour les dictionnaires plats que vous pouvez faire ceci:

from functools import reduce 
reduce(lambda a, b: dict(a, **b), list_of_dicts) 
0

Vous pouvez utiliser la fonction join de funcy bibliothèque:

from funcy import join 
join(list_of_dicts) 
0

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}

Questions connexes