2012-07-18 18 views
6

Powiedzmy mam listę słowników tak:Jak mogę łączyć słowniki z tymi samymi kluczami w pythonie?

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} 

chciałbym wziąć te i zbudować wielki słownika tak:

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

Czy istnieje elegancki „zip” -jak sposób dla mnie to zrobić?

Wszystkie klucze zawsze będą identyczne.

Zawsze mogę powtórzyć klawisze na każdym i skonstruować nowy słownik list, ale wydaje się to bardzo niepoprawne.

Odpowiedz

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

(I zmieniono nazwę dict do dicts od dict jest wbudowany i dicts większy sens.)

Albo, ze zrozumieniem dict:

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

lub, w przypadku Python < 2.7:

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

Awesome. Nauczyłem się czegoś nowego ze zrozumieniem. Dzięki! – hide0

3

Jeśli wszystkie dyktety mają sam e zestaw kluczy, to będzie działać:

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

Jeśli mogą mieć różne klucze, trzeba najpierw zbudowany zestaw kluczy wykonując określone związki na klawiszach różnych dicts:

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

Potem trzeba chronić przed brakujących kluczy w niektórych dicts:

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

Możesz użyć słownika: '{k: [d [k] dla d in dictList [dla k in dictList [0]}' – Blender

+0

Tak, jeśli używasz wersji Pythona, która obsługuje słownikowe rozumienie. Używam 2.6 siebie, więc nie mam tego. – BrenBarn

+0

Zrozumienie dict jest syntaktycznie synonimem wyrażenia generatora, w którym '{key: value ...}' jest zamieniane na 'dict ((key, value) ...)', które jest poprawne nawet w 2.6 –

0

można łączyć ze słowników w następujący sposób:

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])) 
    } 
Powiązane problemy