当前位置: 首页 > 面试题库 >

Python:在存在nan的情况下排序功能中断

谭彦
2023-03-14
问题内容

sorted([2, float('nan'), 1]) 退货 [2, nan, 1]

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

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

我问了一个相关的问题有关max,并根据我理解为什么sort是这样工作的。但这应该被视为错误吗?

文档只是说“返回一个新的排序列表”,而没有指定任何详细信息。

编辑:我现在同意这不违反IEEE标准。但是,我认为,从任何常识角度来看,这都是一个错误。甚至不知道经常承认错误的Microsoft都已将此错误识别为错误,并在最新版本中对其进行了修复:http :
//connect.microsoft.com/VisualStudio/feedback/details/363379/bug-
在列表中的双重排序在列表中包含double
nan

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

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

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


问题答案:

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

在任何语言中,sort都会在输入值的范围内应用由比较功能或其他方式定义的给定顺序。例如,operator <,当且仅当小于定义输入值的适当排序时,才可以使用小于号。

但是,对于浮点值和小于以下的值,这不是特别正确的:“ NaN是无序的:它不等于,大于或小于任何值,包括其自身。” ( 从GNU C手册中清除散文,
但适用于所有IEEE754基于现代的 浮点数

因此,可能的解决方案是:

  1. 首先删除NaN,使输入域通过<(或正在使用的其他排序函数)定义良好
  2. 定义一个自定义比较函数(又称谓词),该函数确实定义了NaN的排序,例如小于任何数字或大于任何数字。

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

实际上,考虑到python,如果您不太关心最快的性能或者上下文中是否需要删除NaN,则我宁愿删除NaN。

否则,您可以通过较旧的python版本中的“ cmp”或通过使用and来使用合适的谓词函数
functools.cmp_to_key()。自然,后者要比先去除NaN更尴尬。和关怀将被要求避免 糟糕的 表现,定义这个谓词功能时。



 类似资料:
  • 问题内容: 我想知道是否有一种方法可以在不使用内置函数的情况下实现SQL分析功能。 问题答案: 这是三个等效的表达式: 假设存在,以使行对于“ row_number”而言是唯一的。

  • 问题内容: 我用的是需要挂钩的BabelJS(原名6to5)与运行节点的应用程序es6features: 我打电话来运行我的 app.js6 。我需要安装BabelJS并为我想使用es6features的每个项目提供一个 run.js。 我希望打个电话。如何独立实现该系统(Unix和Windows)? 问题答案: 将and (又名ES6)依赖项添加到应用程序的package.json文件中,并定义

  • 问题内容: 如何在不同情况下( 大写 和 小写 )对带有varchar2列的表进行排序? 例如,当我按“名称”列进行排序时,将得到以下结果: 我想要的是这样的: 问题答案: 使用,例如 如果您需要解决非英语语言的特殊字符,则可能需要有关NLSSORT的其他答案。如果您不这样做,我会尝试和KISS一起使用,因为它很容易记住和使用,并被他人阅读(可维护性)。

  • 问题内容: 我有两个桌子: 1) 2) 我需要整理一下所有内容并加入 例如,对所有用户进行某种排序: 一切看起来都不错,可以排序了。之后,我加入,我的哭泣将中断: 如何与 原始分类 保存? 我无法对结果进行排序,因为* 我 在数据库中 花费约0.02s之前(约1000000个用户)就这样做了,但是当我花费约3.2s的时间后才这样做,这是非常大的时间:( * **演示:rextester.com/D

  • 我的程序中只有两个线程。 我读过Java内存模型,从线程2中我所理解的读一个总是给我1。 我想知道我的理解是否正确。 特别是可以重新排序仍然发生,所以我看到a=0在第二个线程?

  • 我已经创建了一个在视觉上类似于一张卡(游戏卡)的对象-一张顶部有图像的卡,下面有一些关于该卡的信息,包括文本和符号。页面上可以有许多卡片。 单击一张卡片会将用户带到一个新页面。这是通过使用href将所有卡片元素包装在一个div中完成的。每张卡都有一个带有一些选项的下拉菜单。最初的问题是,单击下拉菜单时,卡也会被单击。 我想在单击下拉菜单时阻止卡被单击。单击下拉菜单时,下拉菜单本身应正常运行。 hr