Python 与通过列表理解获得的结果不同的sorted()函数

Python 与通过列表理解获得的结果不同的sorted()函数,python,sorting,floating-point,Python,Sorting,Floating Point,我似乎在Python内置的sorted函数中遇到了一个bug。我似乎在任何地方都找不到对它的文档化或描述,但根据我对Python的理解,我也得到了一些天生不可能的结果,所以我希望有人能帮助我,或者至少能为我指明正确的方向 首先,我有一个很长的浮动列表(确切地说是140万)。它们都很小,有些彼此很近。事实上,当铸造到一组时,长度仅为~240k 我的目标很简单:我需要找到一个截止点,这样只有n值高于这个截止点,看起来很简单。这是我目前的代码: sorted_values = sorted(all_v

我似乎在Python内置的
sorted
函数中遇到了一个bug。我似乎在任何地方都找不到对它的文档化或描述,但根据我对Python的理解,我也得到了一些天生不可能的结果,所以我希望有人能帮助我,或者至少能为我指明正确的方向

首先,我有一个很长的浮动列表(确切地说是140万)。它们都很小,有些彼此很近。事实上,当铸造到一组时,长度仅为~240k

我的目标很简单:我需要找到一个截止点,这样只有
n
值高于这个截止点,看起来很简单。这是我目前的代码:

sorted_values = sorted(all_values)
top_250 = [item for item in sorted_values if item < sorted_values[250]]
len(top_250)  # 5828
代码以再现不同但足够相似的错误,其解决方案也将解决我的初始问题(可能):

test=json.load(打开(“github\u gist.json”))
测试=分类(测试)
打印(len([如果项目<测试[250]],则测试中的项目对应项目])#8

您的数据包含
nan
(“不是数字”)。这会把排序搞得一团糟,因为
nan
与所有内容相比都是
False
。演示:

>>> sorted([0.3, float('nan'), 0.1])
[0.3, nan, 0.1]
为了明确我对比较的意思:

>>> nan = float('nan')
>>> nan < 3
False
>>> nan > 3
False
>>> nan == 3
False
>>> nan == nan
False                 # yeah
>nan=float('nan')
>>>nan<3
假的
>>>nan>3
假的
>>>nan==3
假的
>>>nan==nan
错#对

您确实需要创建一个。向我们展示一些示例浮点值来说明问题。你应该能够用一些值来复制它。@JohnKugelman我知道,我已经试过了,但我无法用我最初的尝试来复制它。我不是在寻找一个完整的解决方案,我很好奇任何数据是如何产生我所看到的结果的。由于我看不到这种行为出现的任何方式,因此重新创建该行为或诊断它是我的主要瓶颈。“我最好的猜测是排序比较器的操作方式与Python中传统的<不同。”不,它没有
sorted
创建一个列表,用数据填充它,然后调用该列表的
.sort
方法。
.sort
方法调用它正在排序的对象的
\uuu lt\uuuu
方法,就像使用
作为示例说明为什么示例优于描述一样,您编写了“列表是所有浮动的列表,所有浮动都在0和1之间”,这是错误的。@SlaterTyranus:您不可能经历所有这些。如果一个NaN在
排序的\u值中
,与它的任何比较都不会满足
,那么报告错误
将无法揭示问题。测试需要
如果早些时候,非常感谢您花时间来解决这个问题!我不知道这里是如何处理nan的。我假设它们会小于每个数字,或者大于每个数字,或者类似的东西。我从来没有意识到他们都比每一个数字都多,也比每一个数字都少。我也不知道python会毫无怨言地进行这类操作,实际上是无声地出错,并使数据的进一步使用无效。它不是“多于或少于每个数字”,而是既不多于也不少于。我添加了几个例子来说明这一点。虽然我相信如果它越来越少,它也会让分拣变得越来越困难。
>>> sorted([0.3, float('nan'), 0.1])
[0.3, nan, 0.1]
>>> nan = float('nan')
>>> nan < 3
False
>>> nan > 3
False
>>> nan == 3
False
>>> nan == nan
False                 # yeah