首页 > 解决方案 > 如何使用带有两个参数的 lambda 来找到具有最高值的元素?

问题描述

我的任务是使用 lambda 函数在列表中查找最大值。使用 lambda 函数,我必须有两个参数,而且我很难从列表中检索元素以在 lambda 函数中使用。

我了解如何通过定义函数来执行任务,但我不知道如何将其转换为 lambda 函数。

myList = [1,2,3,4,5,6,7,8,9,10]

#Here I can find the max value by defining a function

def maxVal(list_a):

   max = 0

   for i in list_a:

       if i > max:
          max = i
   return max
print(maxVal(myList))

#Here I attempt to use a lambda function to find the max value

maxMyList = map(lambda x,y: x[0] >= y[0], myList, myList)

print(maxMyList(myList,myList))

编辑:很抱歉有任何混淆,因为这是我第一次在这里发帖。只是为了清楚起见,我不能定义在这个程序中使用的任何函数。我只是想发布定义函数 maxVal 的代码,以表明我理解我需要做的逻辑。感谢您的所有回复,我真的很感激!

标签: python

解决方案


你做这件事的方式真的没有错。您只需要以正确的方式将 lambda 合并到其余代码中:

myList = [1,2,3,10,4,5,6,7,8,9]

def maxVal(list_a, compare_function):
    max = -sys.maxsize - 1  # strange but true...this seems to be the canonical way to get the smallest 32 bit `int`
    for i in list_a:
        if compare_function(i, max):
            max = i
    return max

my_compare_function = lambda x,y: max(x, y)

print(maxVal(myList, my_compare_function))

结果:

10

我确实必须改变return max被调用的级别。当您将代码放入 SO 问题时,我不知道这是逻辑错误,还是只是转录错误。另请注意,我将 10 移动到输入数据中的不同位置,以确保它不必在最后才能被发现是最大值。

如果你想要一个“更酷”和更现代的答案,reduce它真的是为你想要的而设计的。这是一个简单的解决方案。

import functools

myList = [1,2,3,10,4,5,6,7,8,9]
r =  functools.reduce(lambda v1, v2: max(v1, v2), myList)
print(r)

结果:

10

另请注意,“max”本身是一个带有两个参数的函数,因此您可以直接使用它来获得一些非常简单的东西......这在您的分配是使用 lambda 的情况下并不适用:

myList = [1,2,3,10,4,5,6,7,8,9]
r =  functools.reduce(max, myList)
print(r)

这些编写循环的功能等价物风靡一时,而且有充分的理由。当与将数据作为流处理相结合时,这是一个超级强大的想法。随着它变得越来越流行,我认为它会被认为更具可读性。作为一个老前辈,我刚刚开始使用所有这些函数式/流式编程......在 Java 中比在 Python 中更多,但仍然如此。这是一套功能强大的工具,有助于您真正理解。


推荐阅读