编辑:对于所有偏执狂的人来说,复制代码不再使用eval。
我不会说我发现了Python中的一个错误(这会让我立即被投票),但这是一些非常奇怪的行为。我有一个列表pairs
,并使用自定义sort
函数调用key
,该函数不会更改状态。然后我获取pairs
的子集(以相同的顺序),并使用相同的键功能再次调用sort
。结果与原始子集不同。这可能吗?
我为你们as a GitHub Gist提供了一个复制品。准备步骤:
下载所有4个文件(dpd.txt
,index_map.txt
,ids.txt
和weirdsortbehavior.py
)并将它们放在同一目录中
运行Python程序(注意:使用Python 3,尚未测试Python 2)。对我来说它打印出来
0 1916
1 0
对此有何解释,我该怎么做才能解决?感谢。
答案 0 :(得分:2)
我想我找到了原因。这是因为nan
中有一些dpd.txt
。
nan
无法比较:
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
它会起作用。