Python 浮点数在列表中排序的问题

原创
2015/01/14 23:25
阅读数 2.1K

这两天写python代码遇到了很多问题,今天调试了一天的一个问题,发现是用list.sort进行浮点数排序时的一个问题导致的。

l = [1, 2, 3]
l.sort(cmp = lambda x, y: y - x)

上面这段代码很轻松就可以敲出来。执行以后l的内容会变成[3,2,1],通过传入不同的cmp函数来实现不同的排序。

但是当列表里存放的是浮点数时,就会有一些问题发生。首先是,会抛出一个异常,告诉你cmp的返回值必须是int型

l = [1.0, 2.0, 3.0]
l.sort(cmp = lambda x, y: int(y - x))

好,改好了。你要int,我就给你int,上面的代码运行了一下,输出结果满足期待。ok,要是真这样放进实际的项目里,可能会发生大问题。而我调试了很久,发现最后的问题就是出在这里。

在科学计算里,差值经常会很小,比如1.1-1.2=-0.1,那么int(-0.1) = 0。看到了吗?这里cmp的返回就变成了0。0在list.sort的定义里就是不交换元素的位置,因为这两个元素是一样“大小的”,这样list.sort执行时就发生了问题!

def my_cmp(x, y):
    temp = y - x
    if temp > 0:
        return 1
    elif temp == 0:
        return 0
    else:
        return -1

l.sort(cmp=my_cmp)

以上是我的解决方法。

总结,只是为了一时的爽快(随手写个匿名函数当参数传递进去解决问题)和形式优美而忽略了真正的计算逻辑。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部