【问题标题】:confused by python builtin sort() returning out-of-order items [closed]被python内置排序()返回乱序项目混淆[关闭]
【发布时间】:2021-10-25 17:33:18
【问题描述】:

我有一个大的 (~26k) 字典列表;我调用.sort(key=lambda x:x['score'], reverse=True) 按每个元素的分数对列表进行排序。虽然它确实进行了一些排序,但不难找到乱序项目的示例。

具体来说,我有一个{specimen:"Specimen Name", test_param:2.6, score:0.8649} 形式的数据集(分数在-1 和1 之间,这就是我要排序的结果)。这些条目中约有 26k 被放入一个列表中(我们称之为data)。我调用data.sort(key=lambda x:x['score'], reverse=True),但结果列表包含列表中间的项目,这些项目的得分高于头部;除了“通常”从大到小之外,这些项目的顺序没有可辨别的(对我而言)模式。

我尝试了几种方法来确保它不是一些愚蠢的类型错误:在 lambda 中强制转换为浮点数并使用 key=lambda x:float(x.get('score', -100)) 提供默认值;将字典列表重新格式化为元组列表(分数,字典)并按 x[0] 排序。它返回的(不正确的)顺序非常一致,所以我排除了竞争条件的异常。

我已经手工制作了一个简单的排序功能,并且效果很好(只是速度较慢)。这个看似简单的排序案例怎么会表现出如此奇怪的行为?

【问题讨论】:

  • 你能提供一些不合适的项目(实际的python对象文字)的例子吗?
  • 此类排序问题的常见原因是您的值实际上是字符串 - 但看起来您已经尝试过可以解决该问题的代码。我们需要查看minimal reproducible example,或者至少是错误排序值的样本。
  • dict 中的键不是字符串。这是预期的吗?
  • 结果在 26k 条目中的某个地方,有一些 NaN,这让所有事情都搞砸了。

标签: python python-3.x sorting


【解决方案1】:

有人建议我检查 score 中的 NaN 值,果然,有一些。现在删除这些可以使排序正常工作。

TL;DR - 不允许在排序键中使用 NaN。如果您看到奇怪的排序行为,请检查 NaN。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多