2012-07-18 6 views
6

のは、私はそうのような辞書のリストを持っているとしましょう:辞書をPythonの同じキーと組み合わせるにはどうすればいいですか?

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} 

私はこれらを取り、そのような大きな辞書を構築したいと思います:

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

は、任意のエレガントな「zip」様があります私にこれをさせる方法?

すべてのキーは常に同じになります。

私はいつもそれぞれのキーを反復してリストの新しい辞書を作ることができますが、それは非常に非pythonのようです。

答えて

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

(dictのがビルトインされ、そしてdictsがより理にかなっているので、私はdictsにごdictの名前を変更しました。)

あるいは、dictの理解と:

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

か、についてPython < 2.7:

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

驚くばかりです。私は理解で新しいことを学びました。ありがとう! – hide0

3

すべてのディクテーションにsam彼らは異なるキーを有することができる場合は、

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

最初に、様々なdictsのキーに設定された労働組合を行うことにより、キーのセットを建てする必要があります:キーのEセットが、これは動作します

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

次に、あなたは、いくつかのdictsに不足しているキーに対して保護する必要があります:

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

辞書の理解を使用することができます: '{k:[d [k] for dictList [dictList [0]}'の – Blender

+0

はい、辞書の理解をサポートするPythonバージョンを使用しています。私は2.6を使用しているので、私はそれを持っていません。 – BrenBarn

+0

dictの理解は、 '{key:value ...} 'が' dict((key、value)...)'に置き換えられたジェネレータ表現と構文的に同義です。これは2.6でも有効です –

0

あなたは次のように辞書をマージすることができます

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])) 
    } 
関連する問題