使用reduce似乎很难实现,因为如果您“ reduce”的两个元组都没有相同的字母,那么您将无法计算结果.如何减少(‘a’,1)和(‘b’,1)到可行的结果?
我能做的最好是l = functools.reduce(lambda x,y:(x [0],x [1] y [1])如果x [0] == y [0]否则x y,sorted(l))
它给了我(‘a’,3,’b’,1,’c’,1,’c’,1).因此,它对于第一个元素来说有点奏效,但需要多次通过才能进行其他操作(重新创建元组并进行另一次类似的减少,至少可以说这不是很有效!).
无论如何,这里有2种可行的方法
首先,使用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,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)]
元组列表整合方法
本文介绍了两种处理元组列表的有效方法:使用collections.Counter统计相同类型元素的出现次数,并利用itertools.groupby对排序后的列表按名称分组并求和。这两种方法能够解决reduce函数难以处理的问题。

被折叠的 条评论
为什么被折叠?



