2016-07-28 7 views
-1

私はこのように見て、Pythonの辞書のリストを持っている:私の場合はマージPythonの辞書のキーがある値

[{key1: value1, key2: array1}, {key1: value2, key2: array2}, {key1: value3, key3: array3},...] 

は、これらの辞書の一部はキー1に同じ値を持って、例えば、 value1 = value3。どうすればこのように見える辞書の配列を得ることができますか?

[{key1: value1, key2: array1+array3}, {key1: value2, key2: array2},...] 

"array1 + array3"は元の配列1と配列3の配列の要素が追加された単一の配列ですか?

編集:これはキーによってマージされません。配列内の各辞書は厳密に同じ構造を持っています:{key1: "some_string"、key2:[array]} - 私は "some_string"に "merge"したいので、[array] key2の値は、key1の値と同じ "some_string"を持つリスト内の他の辞書の配列と連結されます。

+0

可能な複製(http://stackoverflow.com/questions/38987/how-can-i [どのように私は、単一の式で2つのPythonの辞書をマージすることができますか?] -merge-two-python-dictionaries-in-a-single-expression) –

答えて

0

あなたが望むことを行う最良の方法は、少なくとも一時的にデータを再構成することです。 valueからarray(固定キーなし)にマップされた辞書を使用する場合は、すべてのデータを1つの場所に配置し、重複した値が発生すると効率的に検出して値を結合できます。必要であれば、後で単一の辞書を小さな辞書のリストに戻すことができます。最後に、リストの順序は任意となります

merged = {} 
for d in list_of_dicts: 
    if d["key1"] not in merged: 
     merged[d["key1"]] = d["key2"] 
    else: 
     merged[d["key1"]] += d["key2"] 

# if necessary, put back into a list of dicts: 
merged_list = [{"key1": k, "key2": v} for k, v in merged.items()] 

はこのような何かを試してみてください。元のリストのディクテーションの順序を保持したい場合はmergedOrderedDictを使用できます。

0

key1でグループ化したいので、itertools.groupby()を使用できます。

from operator import itemgetter 
from itertools import groupby 

list_of_dicts = [{'key1': 1, 'key2': [1, 2]}, 
       {'key1': 2, 'key2': [3, 4]}, 
       {'key1': 1, 'key2': [5, 6]}] 

grouped = groupby(sorted(list_of_dicts, key=itemgetter('key1')), 
        key=itemgetter('key1')) 
result = [{'key1': k, 
      'key2': [elt for item in g for elt in item['key2']]} 
      for k, g in grouped] 
print(result) 

出力:の

[{'key2': [1, 2, 5, 6], 'key1': 1}, {'key2': [3, 4], 'key1': 2}] 
関連する問題