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

这两天写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)

以上是我的解决方法。

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

转载于:https://my.oschina.net/sooshian/blog/367837

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值