为什么如果我传递 lambda 作为键,与将其直接应用于具有相同 lambda 的原始可迭代的映射相比,max 的行为会有所不同?

2024-03-23

我试图理解 max 函数中关键参数的工作原理,它来自从列表中查找最接近 0 的整数的问题,并在列表中具有相同正值和负值的情况下使用正值。

我发现这是一个有效的在线解决方案,给定一个整数 x 列表:

print(max(a, key=lambda x: (-abs(x), x), default=0))

这将返回一个整数,我希望返回一个元组,因为 lambda 会将 x 的每个元素转换为一个元组,然后我这样做了:

b = list(map(lambda x: (-abs(x), x), a))
max(b)

第二个示例返回一个元组。为什么第一个在比较 lambda 生成的元组时返回单个元素?


您正在比较两个不同的事物。

对于您的第一个案例,如果我们查看文档:https://docs.python.org/3/library/functions.html#max https://docs.python.org/3/library/functions.html#max

max(arg1, arg2, *args[ 键])
返回可迭代中最大的项或两个或多个参数中最大的项。 key 参数指定一个单参数排序函数,类似于 list.sort() 所使用的函数。

这意味着关键lambda x: (-abs(x), x)是一个排序函数,这意味着对于每个x在可迭代中a, (-abs(x), x)被评估并用于对项目进行排序以找出迭代器的最大元素,并根据该排序,1是最大元素

In [24]: a = [1,4,6,-8,-10] 

In [40]: print(max(a, key=lambda x: (-abs(x), x), default=0))                                                                                                                       
1

对于第二种情况,如果我们查看文档:https://docs.python.org/3/library/functions.html#map https://docs.python.org/3/library/functions.html#map

映射(函数,可迭代,...)
返回一个迭代器,该迭代器将函数应用于可迭代的每个项目,并产生结果

这意味着该函数lambda x: (-abs(x), x)应用于每个元素x of a,所以我们回来(-abs(x), x)对于每个 x,以及max应用于更新的迭代器,这是最大的元组(-1,1)

In [25]: b = list(map(lambda x: (-abs(x), x), a))  

In [26]: b                                                                                                                                                                          
Out[26]: [(-1, 1), (-4, 4), (-6, 6), (-8, -8), (-10, -10)]

In [27]: max(b)                                                                                                                                                                     
Out[27]: (-1, 1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么如果我传递 lambda 作为键,与将其直接应用于具有相同 lambda 的原始可迭代的映射相比,max 的行为会有所不同? 的相关文章

随机推荐