我有以下元组列表:[('a', 1), ('a', 1), ('b', 1), ('c',1), ('a ', 1), ('c', 1)]
我想知道我是否可以利用 python 的 reduce
函数来聚合它们并产生以下输出:[('a', 3), ('b', 1) , ('c', 2)]
或者如果有其他方法,我也想知道(循环就好)
最佳答案
使用 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,排序(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)]
关于python - 如何仅通过使用 reduce 函数在 python 中创建字数统计输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43172488/