使用 NaN,可能会得到一个无法正确排序的列表:
--> NaN = float('nan')
--> spam = [1, 2, NaN, 3, NaN, 4, 5, 7, NaN]
--> sorted(spam)
[1, 2, nan, 3, nan, 4, 5, 7, nan]
我正在构造一个 Null
对象,它的行为很像 NaN
,其语义是如果返回的对象是 Null
,它的实际值(value)未知。 Null
对象还可以与任何其他类型的对象(int
、float
、str
、 bool
等),但任何交互都会导致 Null
。
从纯粹的角度来看,如果它是未知的,那么比较结果也是未知的,因为实际值可能大于、小于或等于被比较的值。
从实际的角度来看,一个散布着 Null 的列表是一个让人头疼的问题。
所以我强烈倾向于实现比较,使得 Null 对象少于其他对象,因此它们总是排序在一起。
当然,我总是可以回避这个问题并强制用户实现自定义排序键。
任何想法/建议/批评/等等?
最佳答案
NaN
通常被定义为无法与任何事物相比。任何涉及 NaN
的计算应该返回 NaN
.
事实上:
>>> print float('nan') == float('nan')
False
是:NaN
甚至和它自己都不一样。这样做是有充分理由的,尽管它确实违反直觉。主要原因可能是 - 与所有其他数字相比 - 没有独特的升序排序方式。应该先来,最后,最后吗?在无限之前还是之后? float 有一些奇怪的事情。但至少-infty < -123 < -0 <= +0 < 123 < +infty
是毫无疑问的.
“不是数字”,怎么可能大于、小于或等于一个数字呢?
当然,您可以定义自定义比较函数,该函数对 NaN
具有明确定义的排序行为。值(value)观:
def s(x, y):
import math
if math.isnan(x): return 1
return cmp(x, y)
请注意我是如何使用 math.isnan
的.这个函数语义清晰:它首先对所有数字进行排序,然后是任何NaN
。值(value)。
关于python - 空值和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8855632/