我运行以下语句序列:
>>> a = range(10)
>>> min(a, key=lambda x: x < 5.3)
6
>>> max(a, key=lambda x: x < 5.3)
0
最小值和最大值与我期望的完全相反。
关于min和max的python文档非常粗略。
任何人都可以向我解释“关键”是如何工作的吗?
key
论证的解释关键作品如下:
a_list = ['apple', 'banana', 'canary', 'doll', 'elephant']
min(a_list, key=len)
返回'doll'
,和
max(a_list, key=len)
返回'elephant'
您为它提供了一个函数,它使用应用于每个项的函数结果的最小值或最大值来确定在结果中返回哪个项。
如果你的函数返回一个布尔值,就像你的那样,对于min,它将返回最小值True或False的第一个(False),它将是6或者max(True)的第一个为0。
看到这个:
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> import pprint
>>> pprint.pprint(dict((i, i<5.3) for i in a))
{0: True,
1: True,
2: True,
3: True,
4: True,
5: True,
6: False,
7: False,
8: False,
9: False}
为什么?
>>> min([True, False])
False
>>> max([True, False])
True
为什么True
大于False
?
>>> True == 1
True
>>> False == 0
True
>>> issubclass(bool, int)
True
事实证明,True
和False
与1
和0
密切相关。他们甚至分别对它们进行评估。
因为所有的值都是True
或False
。因此,每个人中的第一个被选中。
min([True, 1, False, 0])
将返回False
而不是0
,因为两者都具有相同的值,但False
首先发生
您的代码使用仅具有布尔值的key
函数,因此,对于min
,第一个False
发生在数字6
。所以它是被选中的。
你可能想做的是:
min(x for x in range(10) if x < 5.3)