Python:列表的一个子集是否有任何理由与原始列表排序不同?

时间:2018-04-17 03:08:10

标签: python sorting

编辑:对于所有偏执狂的人来说,复制代码不再使用eval。

我不会说我发现了Python中的一个错误(这会让我立即被投票),但这是一些非常奇怪的行为。我有一个列表pairs,并使用自定义sort函数调用key,该函数不会更改状态。然后我获取pairs的子集(以相同的顺序),并使用相同的键功能再次调用sort。结果与原始子集不同。这可能吗?

我为你们as a GitHub Gist提供了一个复制品。准备步骤:

  1. 下载所有4个文件(dpd.txtindex_map.txtids.txtweirdsortbehavior.py)并将它们放在同一目录中

  2. 运行Python程序(注意:使用Python 3,尚未测试Python 2)。对我来说它打印出来

    0 1916
    1 0
    
  3. 对此行为感到惊讶。
  4. 对此有何解释,我该怎么做才能解决?感谢。

1 个答案:

答案 0 :(得分:2)

我想我找到了原因。这是因为nan中有一些dpd.txt

nan无法比较:

{p> float('nan') > 1 # False float('nan') < 1 # False

所以这完全打破了比较。

如果您将密钥比较功能更改为:

def _key(id_):
    import math
    result = -dpd[index_map[id_]], id_.lower()
    if math.isnan(result[0]):
        result = 0, id_.lower()
    return result

它会起作用。