空和排序

Eth*_*man 2 python sorting null python-3.x

使用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]
Run Code Online (Sandbox Code Playgroud)

我正在构建一个Null行为很像的对象,NaN语义是如果返回的对象是Null,它的实际值是未知的.甲Null对象也将能够与任何其他类型的对象(的相互作用int,float,str,bool,等等),但任何相互作用将导致Null.

从纯粹主义的观点来看,如果未知,则比较结果也是未知的,因为实际值可能比所比较的值更大,更小或相同.

从实际的角度来看,散落的Nulls列表是背后的痛苦.

所以我强烈倾向于实现比较,使得Null对象比其他对象少,所以它们总是排在一起.

当然,我总是可以避开该问题并强制用户实现自定义排序键.

任何想法/建议/批评/等?

Ano*_*sse 5

NaN通常被定义为无法与任何东西相比.任何涉及的计算NaN都应该返回NaN.

事实上:

>>> print float('nan') == float('nan')
False
Run Code Online (Sandbox Code Playgroud)

是的:NaN甚至与自己不一样.有这么好的理由,虽然它确实是违反直觉的.最主要的原因可能是 - 与所有其他数字相比 - 没有独特的方式对它们进行升序排序.应该是第一个,最后一个,到底是什么时候?无限之前或之后?浮点数有几个奇怪的事情.但至少毫无疑问-infty < -123 < -0 <= +0 < 123 < +infty.

这不是一个数字,那么它怎么能比一个数字更大,更小或更平?

当然,您可以定义一个自定义比较函数,该函数具有明确定义的NaN值的排序行为:

def s(x, y):
  import math
  if math.isnan(x): return 1
  return cmp(x, y)
Run Code Online (Sandbox Code Playgroud)

注意我是如何使用的math.isnan.此函数具有明确的语义:它首先对所有数字进行排序,然后对任何NaN值进行排序.