リスト内の辞書内要素のグルーピング

Grouping list elements and datapoints in python – StackOverflow

「itertools.groupby」を使う必要性はそんなに無い.

li = [{'target': 'Equip E', 'datapoints': [744, 14]}, {'target': 'Equip N', 'datapoints': [744, 19]}, {'target': 'Equip E', 'datapoints': [491, 15]}, {'target': 'Equip N', 'datapoints': [491, 15]}]
res = [{'target': k, 'datapoints': [x['datapoints'] for x in li if x['target'] == k]} for k in set(x['target'] for x in li)]
res

[{‘datapoints’: [[744, 19], [491, 15]], ‘target’: ‘Equip N’},
{‘datapoints’: [[744, 14], [491, 15]], ‘target’: ‘Equip E’}]

%%timeit
res = [{'target': k, 'datapoints': [x['datapoints'] for x in li if x['target'] == k]} for k in set(x['target'] for x in li)]

5.06 µs ± 51.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

groupbyを使う場合は,

from itertools import groupby

li2 = [{'target': 'Equip E', 'datapoints': [744, 14]}, {'target': 'Equip N', 'datapoints': [744, 19]}, {'target': 'Equip E', 'datapoints': [491, 15]}, {'target': 'Equip N', 'datapoints': [491, 15]}]
li2.sort(key=lambda x: x['target'])

res = [{'target': k, 'datapoints': [x['datapoints'] for x in v]} for k, v in groupby(li2, key=lambda x: x['target'])]
res

[{‘datapoints’: [[744, 14], [491, 15]], ‘target’: ‘Equip E’},
{‘datapoints’: [[744, 19], [491, 15]], ‘target’: ‘Equip N’}]

%%timeit
li2.sort(key=lambda x: x['target'])
res = [{'target': k, 'datapoints': [x['datapoints'] for x in v]} for k, v in groupby(li2, key=lambda x: x['target'])]

6.23 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

li = [{'target': 'Equip E', 'datapoints': [744, 14]}, {'target': 'Equip N', 'datapoints': [744, 19]}, {'target': 'Equip E', 'datapoints': [491, 15]}, {'target': 'Equip N', 'datapoints': [491, 15]}]
res = []
temp = []
for k in set(x['target'] for x in li):
    for d in li:
        if d['target'] == k:
            temp.append(d['datapoints'])
    res.append({'target': k, 'datapoints': temp})
    temp = []
res

[{‘datapoints’: [[744, 19], [491, 15]], ‘target’: ‘Equip N’},
{‘datapoints’: [[744, 14], [491, 15]], ‘target’: ‘Equip E’}]

%%timeit
res = []
temp = []
for k in set(x['target'] for x in li):
    for d in li:
        if d['target'] == k:
            temp.append(d['datapoints'])
    res.append({'target': k, 'datapoints': temp})
    temp = []

4.59 µs ± 117 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

入れ子構造にするならdefaultdict(Ordereddictを使えばよりシンプルに).

dd = defaultdict(dict)
for d in li:
    dd['target'].setdefault(d['target'], {}).setdefault('datapoints', []).append(d['datapoints']) 
dd

defaultdict(dict,
{‘target’: {‘Equip E’: {‘datapoints’: [[744, 14], [491, 15]]},
‘Equip N’: {‘datapoints’: [[744, 19], [491, 15]]}}})

%%timeit
dd = defaultdict(dict)
for d in li:
    dd['target'].setdefault(d['target'], {}).setdefault('datapoints', []).append(d['datapoints']) 

4.56 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

広告
カテゴリー: 未分類 パーマリンク

リスト内の辞書内要素のグルーピング への1件のフィードバック

  1. ピンバック: how to compare values inside list in python? | 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中