这两天写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)
以上是我的解决方法。
总结,只是为了一时的爽快(随手写个匿名函数当参数传递进去解决问题)和形式优美而忽略了真正的计算逻辑。