python - 空值和排序

标签 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]

我正在构造一个 Null 对象,它的行为很像 NaN,其语义是如果返回的对象是 Null,它的实际值(value)未知。 Null 对象还可以与任何其他类型的对象(intfloatstrbool 等),但任何交互都会导致 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/

相关文章:

python - Pandas Dataframe 中的对 boolean 值进行分组

python - Django 的 Nginx 504 网关超时错误

c# - 方法中返回null

java - 为什么基元不能为空

ios:将 NSString 与 "<null>"进行比较无效

Python 3 turtle 绘图速度

python - 单精度大端浮点值到 Python 的 float ( double ,大端)

json - 在dart中按字母顺序对对象的JSON数组以及属性的 bool 值进行排序

javascript - 如何按值对redis中的哈希进行排序

javascript - Typescript 中用于对数组进行自定义排序的比较器