2012-07-18 7 views
6

Sagen wir, ich habe eine Liste der Wörterbücher in etwa so:Wie kann ich Wörterbücher mit denselben Schlüsseln in Python kombinieren?

dict[0] is 
{'key_a': valuex1, 
'key_b': valuex2, 
'key_c': valuex3} 

dict[1] is 
{'key_a': valuey1, 
'key_b': valuey2, 
'key_c': valuey3} 

dict[2] is 
{'key_a': valuez1, 
'key_b': valuez2, 
'key_c': valuez3} 

Ich würde diesen nehmen möchte und ein großes Wörterbuch zu konstruieren wie so:

big_dict: 
{'key_a': [valuex1, valuey1, valuez1], 
'key_b': [valuex2, valuey2, valuez2], 
'key_c': [valuex3, valuey3, valuez3]} 

Gibt es eine elegante „zip“ -ähnlichen Weg für mich, das zu tun?

Alle Schlüssel werden immer identisch sein.

Ich kann immer die Schlüssel auf jedem iterieren und ein neues Wörterbuch von Listen erstellen, aber das scheint sehr unpythonähnlich.

Antwort

11
big_dict = {} 
for k in dicts[0]: 
    big_dict[k] = [d[k] for d in dicts] 

(ich Ihre dict-dicts umbenannt seit dict ein eingebaut ist, und dicts macht mehr Sinn.)

Oder mit einem dict Verständnis:

{ k:[d[k] for d in dicts] for k in dicts[0] } 

oder für Python < 2.7:

dict((k, [d[k] for d in dicts]) for k in dicts[0]) 
+0

Ehrfürchtig. Ich habe mit dem Verständnis etwas Neues gelernt. Vielen Dank! – hide0

3

Wenn alle dicts die sam haben e Satz von Schlüsseln, wird diese Arbeit:

dict((k, [d[k] for d in dictList]) for k in dictList[0]) 

Wenn sie verschiedene Schlüssel haben können, müssen Sie zuerst eine Reihe von Tasten, indem Sie setzen die Gewerkschaften auf den Tasten der verschiedenen dicts gebaut müssen:

allKeys = reduce(operator.or_, (set(d.keys()) for d in dictList), set()) 

Dann müssen Sie die fehlenden Schlüssel in einigen dicts schützen:

dict((k, [d[k] for d in [a, b] if k in d]) for k in allKeys) 
+3

Sie könnten ein Wörterbuchverständnis verwenden: '{k: [d [k] für d in dictList [für k in dictList [0]}' – Blender

+0

Ja, wenn Sie eine Python-Version verwenden, die Wörterbuchkomprehensionen unterstützt. Ich benutze 2.6 selbst, also habe ich das nicht. – BrenBarn

+0

ein dict-Verständnis ist syntaktisch auch auf einen Generator ausdruck wobei '{key: value ...}' durch 'dict ((key, value) ...)' ersetzt wird, was sogar in 2.6 gültig ist –

0

Sie Wörterbücher in der folgenden Art und Weise zusammenführen können:

def merge_dicts(dict_list, separator=''): 
    """ 
    Merges list of dictionaries to a single dictionary, Concatenates values with the same key. 
    :param dict_list: list of dictionaries to be merged. 
    :param separator: separator to be inserted between values of same key. 
    :return: Merged dictionary. 
    """ 
    return {k1: separator.join([d[k1] for d in dict_list if k1 in d]) 
      for k1 in set(reduce(lambda x, y: x+y, [k.keys() for k in dict_list])) 
    } 
Verwandte Themen