Python 2.7-字典中重复项的求和值

Python 2.7-字典中重复项的求和值,python,dictionary,python-2.7,Python,Dictionary,Python 2.7,我有一个字典列表,如: 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}

我有一个字典列表,如:

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}]

在此处搜索存储库,但尚未识别解决方案。非常感谢您的指点。

您可以使用带有2个整数的
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'}]

您可以使用带有2个整数的
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'}]

另一种解决方案是使用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理解的“计数”项
  • 然后groupby收集具有相同子CT的所有原始列表项
  • 最后,列表理解迭代这些组,并对计数项求和(现在使用生成器理解)
缺点:

  • 可读性较差
  • groupby需要对其进行排序,这样可能会使事情变得更慢
优点:

  • 如果列表1已经被排序,这可能会更快。(因为python中的理解速度通常更快)
  • 更短。(甚至可以用一行难以理解的文字书写:)

另一种解决方案,使用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理解的“计数”项
  • 然后groupby收集具有相同子CT的所有原始列表项
  • 最后,列表理解迭代这些组,并对计数项求和(现在使用生成器理解)
缺点:

  • 可读性较差
  • groupby需要对其进行排序,这样可能会使事情变得更慢
优点:

  • 如果列表1已经被排序,这可能会更快。(因为python中的理解速度通常更快)
  • 更短。(甚至可以用一行难以理解的文字书写:)