【问题标题】:Reduce() with a regular function使用常规函数的 Reduce()
【发布时间】:2018-02-05 08:30:53
【问题描述】:

我想使用 reduce() 和一个常规函数来计算两个列表的积和。

返回产品的常规函数​​定义为:

    def func(maturity, weight):
        return maturity * weight

而归约函数是这样的:

reduce(func, zip(terms, weights))

一个错误

"TypeError: can't multiply sequence by non-int of type 'tuple'" 

然后出现。有没有办法通过正则函数而不是lambda来计算两个列表的乘积和?

【问题讨论】:

  • 您能否将您的问题格式化为更具可读性?并举例说明termsweights 的外观。
  • 看起来像你想要的:map(func, terms, weights)... 在这种情况下 - 如果你的函数不仅仅是乘法,你可以使用内置函数,例如:result = map(operator.mul, terms, weights)
  • 对于糟糕的格式真的很抱歉。我尝试按照说明缩进代码,但代码并没有以一种简洁的方式显示。
  • 我明白了!我误解了 reduce 的工作原理。我应该使用 map 来获取产品列表,然后他们使用 reduce 来总结它们。
  • @SiyuZhuang:用sum总结一下!

标签: python python-2.7 function reduce callable


【解决方案1】:

我认为您误解了reduce 的用法。它所做的是在向量上重复应用一个操作以产生一个标量作为最终结果。您想要做的是在不相关的单独元素上应用相同的功能。为此,您需要map

out = map(func, terms, weights)

正如 Jon Clements 所说,如果您的函数像元素乘法一样简单,您可以考虑改用 operator.mul

import operator
out = map(operator.mul, terms, weights)

【讨论】:

  • 除非termsweights 都是元组,那么map 的输出在2.7 中将是list...所以list 在这里很可能是多余的。 (根据我对这个问题的评论 - 如果唯一的操作是将两者相乘,那么使用 operator.mul 不仅很明显它的作用,而且可能会稍微快一点......)
【解决方案2】:

错误是因为你正在乘以元组, func 中的两个参数都是元组,看起来像这样

('A', 1), ('B', 2)

如果你在索引 1 上取元素,它会起作用。

def func(maturity, weight):
    return maturity[1] * weight[1]


terms = ['A', 'B', 'C']
weights = [1, 2]

reduce(func, zip(terms, weights))

snippet

【讨论】:

  • 它似乎不是那样工作的。会有一个 TypeError: 'int' object has no attribute 'getitem'
  • 您可以在答案末尾检查sn-p,它在python2中毫无例外地工作。您没有提供 termsweighs 值的示例,所以我使用了自己的猜测。
猜你喜欢
  • 2020-03-26
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多