【问题标题】:how can I create word count output in python just by using reduce function?如何仅使用reduce函数在python中创建字数输出?
【发布时间】:2017-08-27 14:28:17
【问题描述】:

我有以下元组列表:[('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]

我想知道我是否可以利用 python 的 reduce 函数来聚合它们并产生以下输出:[('a', 3), ('b', 1), ('c', 2)]

或者如果有其他方法,我也想知道(循环很好)

【问题讨论】:

标签: python list tuples reduce word-count


【解决方案1】:

使用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)]

【讨论】:

    【解决方案2】:

    使用defaultdict 子类和sum 函数的替代方法:

    import collections
    
    l = [('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1)]
    d = collections.defaultdict(list)
    for t in l:
        d[t[0]].append(t[1])
    
    result = [(k,sum(v)) for k,v in d.items()]
    print(result)
    

    输出:

    [('b', 1), ('a', 3), ('c', 2)]
    

    【讨论】:

      【解决方案3】:

      另一种方法是创建自定义 reduce 函数。
      例如:
      l = [('a', 1), ('a', 1), ('b', 1), ('c',1), ('a', 1), ('c', 1) ]

      def myreduce(func , seq):
          output_dict = {}
          for k,v in seq:
              output_dict[k] = func(output_dict.get(k,0),v)
          return output_dict  
      
      

      myreduce((lambda sum,value:total+sum),l)

      输出:
      {'a': 3, 'b': 1, 'c': 2}

      稍后您可以将生成的输出修改为元组列表。

      【讨论】:

        猜你喜欢
        • 2013-09-15
        • 2023-03-25
        • 1970-01-01
        • 2015-12-07
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多