python - 如何仅通过使用 reduce 函数在 python 中创建字数统计输出?

标签 python list tuples reduce word-count

我有以下元组列表:[('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/

相关文章:

python - 渐变带 : getting gradient of nan

python - 高斯混合模型 : Difference between Spark MLlib and scikit-learn

python - 使用 SciPy 进行径向采样

python - 遍历嵌套列表并为每个没有递归的元素分配一个相互依赖的值(Python)

c# - 如何在 C# 中使用列表创建循环

list - 使用流/无限列表将Scala(a,b).zipped(或Tuple2.zipped)概念压缩

python - 更改元组列表中元组的第一个值

python - 这些元组可以以某种方式排列吗?

python - 如何在不合并的情况下将多个元组(列表等)添加到单个字典键中?

python - 无法使用 upstart/supervisord 运行 uwsgi