gpt4 book ai didi

Python:排序函数在存在 nan 时中断

转载 作者:IT老高 更新时间:2023-10-28 22:12:34 26 4
gpt4 key购买 nike

sorted([2, float('nan'), 1]) 返回[2, nan, 1]

(至少在 Activestate Python 3.1 实现上。)

我知道 nan 是一个奇怪的对象,所以如果它出现在排序结果中的随机位置,我不会感到惊讶。但它也弄乱了容器中非nan数字的排序,这真是出乎意料。

我问了一个 related question关于 max,基于此,我明白为什么 sort 会这样工作。但这应该被认为是一个错误吗?

文档只是说“返回一个新的排序列表 [...]”,而没有指定任何细节。

编辑:我现在同意这不违反 IEEE 标准。但是,我认为,从任何常识的角度来看,这都是一个错误。就连不经常承认错误的微软也承认这是一个错误,并在最新版本中修复了它:http://connect.microsoft.com/VisualStudio/feedback/details/363379/bug-in-list-double-sort-in-list-which-contains-double-nan .

无论如何,我最终遵循了@khachik 的回答:

sorted(list_, key = lambda x : float('-inf') if math.isnan(x) else x)

我怀疑与默认情况下执行此操作的语言相比,它会导致性能下降,但至少它可以工作(除非我引入了任何错误)。

最佳答案

前面的答案很有用,但可能不清楚问题的根源。

在任何语言中,排序都会在输入值的域上应用由比较函数或其他方式定义的给定排序。例如,小于,又名 operator <,当且仅当小于定义输入值的合适排序时,才能始终使用。

但这不适用于浮点值和小于:“NaN 是无序的:它不等于、大于或小于任何东西,包括它自己。” (来自 GNU C 手册的清晰散文,但适用于所有现代 IEEE754 基于浮点)

所以可能的解决方案是:

  1. remove the NaNs first, making the input domain well defined via < (or the other sorting function being used)
  2. define a custom comparison function (a.k.a. predicate) that does define an ordering for NaN, such as less than any number, or greater than any number.

任何一种方法都可以使用任何语言。

实际上,考虑到 python,如果您不太关心最快的性能,或者删除 NaN 是上下文中所需的行为,我更愿意删除 NaN。

否则,您可以在较旧的python 版本中通过“cmp”或通过this 和functools.cmp_to_key() 使用合适的谓词函数。 .自然,后者比先删除 NaN 更尴尬。在定义此谓词函数时,需要注意避免更差的性能。

关于Python:排序函数在存在 nan 时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4240050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com