我正在尝试对 python 中的 float 列表(和 nan 值)进行排序,例如:
print max(list)
list.sort()
list.reverse()
for i in range(100):
print list[i]
nan
nan
2.0803176458
nan
nan
23.1620761136
15.9680303803
15.3134388394
14.68055076
11.450492644
8.96268420227
8.15331554187
5.24420616524
3.9665322752
3.69758305442
1.08500491226
-0.227894225141
-0.254784399765
-0.866879940573
-1.21267324819
-2.21811678021
nan
nan
2.69325878444
当我运行它时,我最多得到不同的值,并且当它打印出来时我的列表没有排序(结果在上面的代码下面)
有人知道为什么会这样吗?
>>> float('nan') < 3.14
False
>>> float('nan') > 3.14
False
>>> float('nan') < float('nan')
False
>>> float('nan') > float('nan')
False
>>> float('nan') == float('nan')
False
问题是 nan
没有相对于其他数字的排序。比较总是返回 False,无论是针对数字还是其他 nan
值。 sort()
的约定要求列表项具有一致的顺序才能正确排序。
要对 nan
进行排序,您需要覆盖此行为并定义您希望 nan
进行排序的方式。例如,如果您希望它出现在所有其他数字之前,您可以使用 key
函数使 nan
等同于 -inf
。
>>> l = [float('nan'), 3.14, -1, 0, float('nan')]
>>> import math
>>> sorted(l, key=lambda f: float('-inf') if math.isnan(f) else f)
[nan, nan, -1, 0, 3.14]