1

以下のように、Pythonリスト内に複数の辞書があります

[{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105},
 {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105},
 {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106},
 {"color": "#33F", "values": {"y": 80, "x": 12}, "key": 104},
 {"color": "#CC3", "values": {"y": 117, "x": 13}, "key": 105},
 {"color": "#CC3", "values": {"y": 115, "x": 14}, "key": 105},
 {"color": "#CC3", "values": {"y": 102, "x": 15}, "key": 105},
 {"color": "#FF9", "values": {"y": 111, "x": 16}, "key": 106},
 {"color": "#FF9", "values": {"y": 33, "x": 17}, "key": 106}]

上記の辞書を含むリストには、値が同じである「key」と呼ばれるキーがあります(例:105、106など)。これらの辞書では、「値」の値は異なります(例:"values": {"y": 83, "x": 9}105 ) "values": {"y": 117, "x": 13}

同じ「key=xxx」ディクショナリの値を1つのディクショナリに追加して持ち込みたい

たとえば、key = 105の辞書の場合、「値」を集約したいとします。次[{"y": 83, "x": 9},{"y": 117, "x": 13}] のようなリスト内で言います。

最終的な統合出力は、上記の元の構造を保持する必要があります

[{"color"="...","values"=[{...},{...}],"key"="..."},....]

これを達成するための最良の方法は何ですか?

4

4 に答える 4

4

を使用できますcollections.defaultdict

これをlist指定すると、新しいキーがアクセスされたときに空のリストが自動的に作成されます。

from collections import defaultdict

a = [{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105}, {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105}, {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106}, {"color": "#33F", "values": {"y": 80, "x": 12}, "key": 104}, {"color": "#CC3", "values": {"y": 117, "x": 13}, "key": 105}, {"color": "#CC3", "values": {"y": 115, "x": 14}, "key": 105}, {"color": "#CC3", "values": {"y": 102, "x": 15}, "key": 105}, {"color": "#FF9", "values": {"y": 111, "x": 16}, "key": 106}, {"color": "#FF9", "values": {"y": 33, "x": 17}, "key": 106}]

result = defaultdict(list)

for d in a:
    result[d['key']].append(d['values'])

dict(result)今でしょ:

{104: [{'y': 80, 'x': 12}],
 105: [{'y': 83, 'x': 9}, {'y': 123, 'x': 10}, {'y': 117, 'x': 13}, {'y': 115, 'x': 14}, {'y': 102, 'x': 15}],
 106: [{'y': 96, 'x': 11}, {'y': 111, 'x': 16}, {'y': 33, 'x': 17}]}
于 2012-10-08T13:10:48.773 に答える
1
data=[{"color": "#CC3", "values": {"y": 83, "x": 9}, "key": 105}, {"color": "#CC3", "values": {"y": 123, "x": 10}, "key": 105}, {"color": "#FF9", "values": {"y": 96, "x": 11}, "key": 106}, {"color": "#33F", "values": {"y": 80, "x": 12}, "key": 104}, {"color": "#CC3", "values": {"y": 117, "x": 13}, "key": 105}, {"color": "#CC3", "values": {"y": 115, "x": 14}, "key": 105}, {"color": "#CC3", "values": {"y": 102, "x": 15}, "key": 105}, {"color": "#FF9", "values": {"y": 111, "x": 16}, "key": 106}, {"color": "#FF9", "values": {"y": 33, "x": 17}, "key": 106}]

databykey={}   #make a new dictionary
for l in data:   # for each item in the list
 if l['key'] in databykey: databykey[l['key']]['values'].append(l['values'])
 else: databykey[l['key']]={'color':l['color'], 'values':[l['values']]}
 # if the item's key is already in the dictionary, add its values to the list
 # else, add the key to the dictionary with the color and the first value

databykey今でしょ

{104: {'color': '#33F', 'values': [{'y': 80, 'x': 12}]},
 105: {'color': '#CC3','values': [{'y': 83, 'x': 9}, {'y': 123, 'x': 10}, {'y': 117, 'x': 13}, {'y': 115, 'x': 14}, {'y': 102, 'x': 15}]},
 106: {'color': '#FF9', 'values': [{'y': 96,'x': 11}, {'y': 111, 'x': 16}, {'y': 33, 'x': 17}]}}
于 2012-10-08T15:28:02.293 に答える
0

次のようなことを試してください:

dicts = [{...}, {...}]

def get_values(key):
    return [d["values"] for d in dicts if d["key"] == key]

values_for_105 = get_values(105)

あなたの例ではvalues_for_105

[{'y': 83, 'x': 9}, 
 {'y': 123, 'x': 10}, 
 {'y': 117, 'x': 13}, 
 {'y': 115, 'x': 14}, 
 {'y': 102, 'x': 15}]
于 2012-10-08T13:08:51.093 に答える
0

キーに従って要素をグループ化するだけの場合は、itertools.groupby関数を使用すると、インスタンスを作成するための面倒なオーバーヘッドなしで、これを直接実行できますdefaultdict

import itertools

def key_func(elem):
    return elem["key"]

[{k:list(elem)} for k, elem in itertools.groupby(list_of_dicts, key_func)]

これにより、次が生成されます。

[{100: [{'key': 100, 'x': 10, 'y': 20}, {'key': 100, 'x': 5, 'y': 3.4}]},
 {200: [{'key': 200, 'x': 44, 'y': 3.14}, {'key': 200, 'x': -44, 'y': 3.14}]}]

(以下の私のテスト例から)。

これは、これを処理するためのより強力な方法です。(a) 元のキーを dict 内に残すためです (必要に応じて無視することを選択できますが、それらを削除することによって制限されることはありません..したがって、損失が少なくなります)。 (b) グループ化された操作/集計を実行できます (以下の例)。

辞書の最初のリストが呼び出されlist_of_dicts、出力として辞書の新しいリストが必要であり、それらを合計することによってxとのエントリだけが集約されているとします。y

[
 reduce(
        lambda a,b: {"key":a["key"], "x":a["x"]+b["x"], "y":a["y"]+b["y"]},
        list(elem)
       ) 
 for k, elem in itertools.groupby(list_of_dicts, key_func)
]

次のテスト入力で実行すると:

list_of_dicts = [
                 {"key":100, "x":10, "y":20}, 
                 {"key":100, "x":5, "y":3.4}, 
                 {"key":200, "x":44, "y":3.14}, 
                 {"key":200, "x":-44, "y":3.14}
                ]

次に、以下の結果が得られます。

print [reduce(lambda a,b: {"key":a["key"], "x":a["x"]+b["x"], "y":a["y"]+b["y"]}, list(elem)) for k, elem in itertools.groupby(list_of_dicts, key_func)]

[{'key': 100, 'x': 15, 'y': 23.4}, {'key': 200, 'x': 0, 'y': 6.28}]
于 2012-10-08T13:10:04.120 に答える