我对 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 吗?
您的关键功能
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))
有关
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。
根据 [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