使用reduce 似乎很难实现,因为如果您“减少”的两个元组不带有相同的字母,您将无法计算结果。如何将('a',1) 和('b',1) 减少到一些可行的结果?
我能做的就是l = functools.reduce(lambda x,y : (x[0],x[1]+y[1]) if x[0]==y[0] else x+y,sorted(l))
它让我('a', 3, 'b', 1, 'c', 1, 'c', 1)。所以它对第一个元素有点工作,但需要不止一次通过才能完成其他元素(重新创建元组并制作另一个类似的 reduce,好吧,至少可以说效率不高!)。
无论如何,这里有两种工作方式
首先,使用collections.Counter计算同类元素:
l = [('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]
import collections
c = collections.Counter()
for a,i in l:
c[a] += i
我们不能使用 listcomp,因为每个元素都有一个权重(即使这里是 1)
结果:字典:Counter({'a': 3, 'c': 2, 'b': 1})
第二个选项:在排序列表上使用itertools.groupby,按名称/字母分组,并对带有相同字母的整数进行求和:
print ([(k,sum(e for _,e in v)) for k,v in itertools.groupby(sorted(l),key=lambda x : x[0])])
结果:
[('a', 3), ('b', 1), ('c', 2)]