Это потому, что любое действительное число по сравнению с 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