我无法理解min
函数的行为。当nan
是第一个元素时,min
表示nan
是min元素;如果nan
不是第一个元素,它将在列表中给出实际的最小值。
为什么我在这里得到不同的答案?
>>> min([float('nan'),10,2,0])
nan
>>> min([10,float('nan'),2,0])
0
答案 0 :(得分:2)
这是因为与NaN相比,任何实数都是False
,并且在逻辑上,min
的实现等效于:
def min(seq):
minimum, *rest = seq
for i in rest:
if i < minimum:
minimum = i
return minimum
如果列表的第一项为NaN,则列表中的其他任何项都不能认为比NaN小,因为任何i < float('nan')
为False
。另一方面,如果第一项不是NaN,则NaN不可能被认为是最小的,因为任何float('nan') < i
是False
。
如果您希望min
忽略NaN,则可以使用键函数将其映射到无穷大:
from math import isnan
print(min([float('nan'),10,2,0], key=lambda i: float('inf') if isnan(i) else i))
print(min([10,float('nan'),2,0], key=lambda i: float('inf') if isnan(i) else i))
这将输出:
0
0