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

您可以使用defaultdict带有 2 元组的 a 来累积计数,然后将其推回列表...

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 和生成器理解:

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 返回一个没有“count”项目的子词典。
  • 然后 groupby 收集所有具有相同 subdict 的原始列表项
  • 最后,列表推导迭代这些组并对计数项求和(现在使用生成器推导)。

缺点:

  • 可读性较差。
  • 要使 groupby 工作,它需要进行排序,这样可能会使事情变慢。

优点:

  • 如果 list1 已经排序,这可能会更快。(因为理解在 python 中通常更快)
  • 更短。(甚至可以写在一条几乎无法理解的行中:))
于 2013-02-18T15:08:16.250 回答