0

次のような辞書のリストがあります。

list1=[{'a':'apples', 'b':'snack','count':2},{'a':'apples','b':'lunch','count':3},{'a':'apples','b':'snack','count':3}]

リスト内の重複を「a」と「b」でグループ化し、次のように「カウント」を合計する必要があります。

list2=[{'a':'apples','b':'snack','count':5},{'a':'apples','b':'lunch','count':3}]

ここでリポジトリを検索しましたが、解決策が見つかりませんでした。ご指摘ありがとうございます。

4

2 に答える 2

3

2tuple で aを使用しdefaultdictてカウントを蓄積し、それをリストに戻すことができます...

list1=[{'a':'apples', 'b':'snack','count':2},{'a':'apples','b':'lunch','count':3},{'a':'apples','b':'snack','count':3}]

from collections import defaultdict
dd = defaultdict(int)
for d in list1:
    dd[d['a'], d['b']] += d['count']

list2 = [{'a': k[0], 'b': k[1], 'count': v} for k, v in dd.iteritems()]

[{'a': 'apples', 'count': 3, 'b': 'lunch'}, {'a': 'apples', 'count': 5, 'b': 'snack'}]
于 2013-02-17T20:27:21.223 に答える
0

groupby および list、dict および generator 内包表記を使用した別のソリューション:

list1=[{'a':'apples', 'b':'snack','count':2},{'a':'apples','b':'lunch','count':3},{'a':'apples','b':'snack','count':3}]

from itertools import groupby
list1.sort()
group_func = lambda x: {key:val for key, val in x.iteritems() if key!='count'}
list2 = [dict(k, count = sum(item['count'] for item in items)) for k, items in groupby(list1, group_func)]

[{'a': 'apples', 'count': 3, 'b': 'lunch'}, {'a': 'apples', 'count': 5, 'b': 'snack'}]

説明:

  • grouper 関数は項目を受け取り、dict-comprehension を使用して「カウント」項目なしでサブ辞書を返します。
  • 次に、groupby は、同じ subdict を持つすべての元のリスト項目を収集します
  • 最後に、リスト内包表記はそれらのグループを反復し、(現在はジェネレータ内包表記を使用して) カウント項目を合計します。

短所:

  • 読みにくい。
  • groupby を機能させるには、ソートする必要があるため、処理が遅くなる可能性があります。

長所:

  • list1 がすでにソートされている場合、これはおそらくより高速です。(理解は一般的にPythonの方が速いため)
  • 短い。(ほとんど理解できない1行で書くことさえできます:))
于 2013-02-18T15:08:16.250 に答える