繁体   English   中英

最大(*args,关键=...)。 如何修改键以获取某些值?

[英]max(*args, key = ... ). How to modify key to get just certain values?

我对max(*args, key =..) function 有点困惑。假设我有以下列表: my_list = [2, 3, 4, -5, -2, -1] 我想在 my_list 的负值中找到最大值。 为此,我使用以下代码max(my_list, key = lambda x: x<0) ,但它给了我-5 你能解释一下逻辑吗?

你在调用max(my_list, key = lambda x: x<0)时说的是:“列表中的哪个值最大,但是比较每个元素的表达式 (x<0) 的结果值元素的价值。” 因此, max运算符在决定哪个最大时基本上将列表视为[False, False, False, True, True, True] ,在 python 中,这等同于[0, 0, 0, 1, 1, 1] max返回它看到的第一个最大元素,对应于 -5。

您可能希望首先将列表过滤为仅负值,然后对结果调用max

虽然我不会为此单独使用max ,但您可以使用不折叠多个值的适当key function:

max(my_list, key=lambda x: -float('inf') if x > 0 else x)

这会导致所有正值进行比较,就好像它们是负无穷大一样,负无穷大不能是包含任何非正值的列表中的最大值。

(如果所有值都是正数,您需要以某种方式对此进行调整,因为它仍将返回列表中的第一个值:没有连续的值更大。除非有要求,否则我认为超出了问题的 scope如目前所述。)

是的,您可以通过一行max function 来完成此操作。我将在下面进行解释。

还有一种比我最后解释的列表理解更好的方法。

你的问题原因:

如果您提供了 key 参数,这就是 max function 的工作原理。 它将遍历列表的值,然后对每个值应用 lambda function(名为key )。 所以所有的值都将映射到 lambda function 的结果。然后它对这些结果执行max function。

所以当你有key=lambda x: x<0这将返回TrueFalse因为x<0是一个 boolean 表达式。 所以结果列表就像[False, False, False, True, True, True] 这些FalseTrue值被处理为最大 function 的01值。

max function 得到[0, 0, 0, 1, 1, 1]并且它找到第一个是列表中最大数字的第一个(数字 1),即列表中对应于数字 -5 的第一个1原始列表。

解决方案:

有多种方法可以找到最大负数,例如使用 for 循环或列表理解,甚至组合filtermax 但是,为了更好地理解max function 及其参数,我向您展示了如何通过max function 执行您想要的操作(找到最大负数)。

max(my_list, key = lambda x: min(my_list) if x>=0 else x)

此代码将找到最大负数。

这段代码是如何工作的?

提供的 lambda 表达式将 map 所有数字如下:

如果数字是数,我们将其最大值 function 的值替换为最小值,因此它永远不会被选为最大负数。 (我们可以通过filter删除所有负数来完成此操作,但我决定只使用 lambda 来完成所有工作以向您展示方法。)

如果数字是负数,它将保持它自己的价值。 所以对于你的例子,列表是my_list = [2, 3, 4, -5, -2, -1]它将创建[-5, -5, -5, -5, -2, -1]然后它将在此列表上执行max function,它将找到您想要的-1数字。

我希望它可以帮助您了解如何仅通过max function 找到最大负数以及最大值 function 的工作方式。

注意:此代码不是最佳的。 因为每次它计算最小值。 此代码仅用于学习目的。

最好的方法

我相信更好的代码是这样的:

max((num for num in my_list if num<0))

请注意,这不是列表理解。 比列表理解更好 相反,它创建了一个一次只处理一个值的生成器 这比列表理解更好,因为列表理解会立即创建整个列表,然后将其发送到最大值 function。但是这段代码一次处理每个值,并且不会用大列表填充 memory。 所以这样效率更高。

我会使用列表理解来过滤掉正值,然后找到最大值。

max([i for i in my_list if i < 0]) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM