min() 函数中“key”的正确用法是什么? [重复]

问题描述 投票:0回答:3

我对 Python 中的 min() 函数有疑问。我对 min() 中“key”选项的使用感到困惑。有人可以解释一下 key 在 min() 中是如何工作的,尤其是与 lambda 函数有关吗?

例如:

lst = [10, -5, 20, 1]
min(lst, key=lambda x: x > 0)

据我了解,这个表达式应该找到列表 lst 中大于零的最小元素。但是,它返回 -5 而不是 1,这是 lst 中大于零的最小元素。有人可以解释为什么会发生这种情况以及我应该如何在 min() 函数中正确使用 key 吗?

python min
3个回答
1
投票

您的关键功能

key=lambda x: x > 0
只是评估为布尔值。你可以看到你把它写成一个循环:

lst = [10, -5, 20, 1]
for item in lst:
    print(item > 0)

布尔值是整数的子类,所以转换很容易:

lst = [10, -5, 20, 1]
for item in lst:
    print(int(item > 0))

猜猜是什么;

-5
是唯一返回
False
(
0
) 的值,因此这是您获得的最小结果(这是您的关键)。

你可以

filter
这个列表,但实际上,你最好用积极的元素重新构建它,然后使用没有
min()
key
,清楚你在做什么:

lst = [10, -5, 20, 1]
lst = [item for item in lst if item > 0]
print(min(lst))

1
投票

有关

min()
的定义请参考官方doc

Python 的 min() 函数中的

key
参数指定了一个单参数函数,用于从可迭代对象中的每个元素中提取比较键。最小元素是根据键选择的,而不是原始元素本身。

您的查询的解决方案:

min(lst, key=lambda x: x if x > 0 else float('inf'))

float('inf')
是 Python 中一个特殊的浮点值,表示正无穷大。

如果

x
大于
x
,此 lambda 函数返回
0
,否则返回正无穷大
(float('inf'))
。这确保
min()
函数在寻找最小元素时只考虑大于零的元素。在您的情况下,输出将为 1。


0
投票

根据 [Python.Docs]:内置函数 - min(lst, key=lambda):

key 参数指定一个单参数排序函数,就像用于 list.sort().

然后,来自 [Python.Docs]:内置函数 - sort(*, key=None, reverse=False):

key 指定一个参数的函数,用于从每个列表元素中提取比较键(例如,

key=str.lower
)。列表中每个项目对应的键被计算一次,然后用于整个排序过程。
None
的默认值表示直接对列表项进行排序,而不计算单独的键值。

因此,您可以将 key 函数视为 iterable 中元素的转换,并且通过将函数应用于原始 iterable 中的每个元素来对 iterable 进行比较。
这会生成一个结果(来自 2nd(哈希)可迭代),并返回来自 1st 可迭代的相应元素。

>>> l = [10, -5, 20, 1]
>>>
>>> min(lst, key=abs)
1
>>> # The above expression is equivalent to:
>>> min((abs(e) for e in lst))
1
>>> min(l + [0], key=abs)
0
>>>
>>> # Another example
>>> min(lst, key=lambda arg: -abs(arg))
20
© www.soinside.com 2019 - 2024. All rights reserved.