如何通过模仿Python中的reduce函数在列表中找到最大整数?

时间:2018-11-12 11:41:39

标签: python list integer max reduce

这就是我想出的。我定义了一个函数来计算列表中的最大元素,而第二个函数myreduce不起作用。

我不明白为什么我的逻辑有缺陷。我是编程新手。帮助吗?

def maxoflist(l):       #function to compute the maximum element in a list
    maxi=l[0]
    for i in l:
        if i>maxi:
            maxi=i
    return maxi

def myreduce(myfunc,mylist): #this is where I'm trying to mimic the 
    res=[]                   #reduce function
    for i in mylist:
        res.append(myfunc(i))          
    return res
l=[1,2,3]
print(list(myreduce(maxoflist,l)))

1 个答案:

答案 0 :(得分:1)

您没有实现reduce函数。相反,您的myreduce()函数实现了map higher-order function,为myfunc()中的输入生成了一系列mylist结果。映射时,所使用的函数应采用单个输入,并且每个输入都应独立处理,并且输出的结果顺序与产生它们的输入的顺序相同。

higher-order reduce operation将产生单个输出。减少意味着您可以迭代地从之前的减少操作中获取输出,并与下一个输入值一起调用该函数以产生下一个输出。因此,该函数需要两个输入,以使reduce操作正常工作。对于第一步,如果没有先前的输出,则可以从固定的起始值开始,或者仅从输入列表中获取两个输入。每一步产生新的输出时,先前的输出将被丢弃。最后,您只得到一个输出。

使用reduce产生[1, 2, 3]的最大值可以从两个输入开始,一个简单的函数可以确定这两个输入的最大值。然后,该过程将执行以下步骤:

  • 将第一个输入1作为起始“输出”值。如果没有其他输入,则将是最终结果。
  • 使用上一步的初始输出1和下一个输入值2​​,并同时调用该函数。 1和2的最大值为2,因此该函数作为第一个输出结果产生。
  • 使用上一个操作中的2和下一个输入中的3,再次调用该函数。 2和3的最大值为3,因此该函数将作为新输出生成。
  • 没有更多输入,输出为3。

您的reduce实现必须做同样的事情:

  • 从“输出”的给定起始值开始,或者从输入列表中获取第一个值。
  • 对于(其余)输入列表中的每个值,使用最后一个输出和该值调用该函数,然后用返回值替换输出。
  • 处理完所有值后,返回输出。

Python 3已将其实现为functools.reduce(),该文档实际上带有一个纯Python实现,您可以直接复制。