代码之家  ›  专栏  ›  技术社区  ›  James Ko

Python:有什么原因导致列表的子集排序与原始列表不同吗?

  •  -6
  • James Ko  · 技术社区  · 8 年前

    编辑: 仅供所有偏执狂参考,复制代码不再使用eval。


    我并不是说我在Python中发现了一个bug(这会让我立刻被否决),但这是一个很诡异的行为。我有一份清单 pairs 打电话 sort 上面有一个自定义 key 不改变状态的函数。然后我取 成对的 (按相同的顺序),并调用 分类 再次使用相同的键功能。结果与原始子集不同。这可能吗?

    我已经为你们提供了一份复印件 as a GitHub Gist .准备步骤:

    1. 下载所有4个文件( dpd.txt ,则, index_map.txt ,则, ids.txt weirdsortbehavior.py )并将它们放在同一目录中

    2. 运行Python程序(注意:对于Python 3,尚未针对Python 2进行测试)。对我来说是打印出来的

      0 1916
      1 0
      
    3. 对这种行为感到惊奇。

    对此的解释是什么?我能做些什么来修复它?谢谢

    1 回复  |  直到 8 年前
        1
  •  2
  •   Sraw    8 年前

    我想我找到了原因。那是因为 nan 在里面 dpd.txt

    南安 无法比较:

    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
    

    它会起作用的。