【问题标题】:reduce() function in python does not iterate over input list of numberspython中的reduce()函数不会迭代输入的数字列表
【发布时间】:2021-08-04 22:54:08
【问题描述】:

我有一个数字列表:

numbers = list(range(1,21,1))

还有一个计算平均值的简单函数:

def average(a_list):
    sum = 0
    for i in a_list:
        sum += i
    return sum/len(a_list)

我正在尝试使用 reduce 来查找列表的平均值:

from functools import reduce
reduce(average, numbers)

但我收到此错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-85-c930f782df8d> in <module>
----> 1 reduce(average, numbers)

TypeError: average() takes 1 positional argument but 2 were given

【问题讨论】:

  • 为什么使用reduce?正如错误所说,您的 average 函数只接受一个参数。它不是有效的归约函数。只需将numbers 直接传递给averageaverage(numbers)。您可以使用reduce 替换您当前的average 函数,但将average 赋予reduce 目前没有意义。
  • 你认为reduce 是做什么的? reduce 需要一个带有两个参数的函数,你的需要一个。为什么你认为reduce 没有遍历列表?
  • @juanpa.arrivillaga 我意识到我的错误,我的函数平均值需要一个参数,而传递给“reduce”的函数需要 2 个。我试图理解错误语句,但对我什么时候做的事实感到困惑提供 2 个参数,因为我已经通过了一个,列表。我意识到错误语句中的“2”指的是列表的前 2 个元素,并且在 reduce 使用这两个元素来实现平均功能时失败了。现在说得通了,reduce 的目的也很明确了。感谢您的洞察力。
  • @Carcigenicate 谢谢,我现在很清楚“减少”的真正目的

标签: python average reduce


【解决方案1】:

我猜你可以做这样的事情。 lambda x,y : x+y 将帮助我们找到总和,len(list) 将帮助我们除以数据集的长度。

import functools
numbers = list(range(1,21))
def Average(a_list):
    return functools.reduce(lambda x,y : x+y ,a_list)/len(a_list)
print(Average(numbers))

输出

10.5

【讨论】:

    猜你喜欢
    • 2017-06-29
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2020-08-06
    相关资源
    最近更新 更多