排序函数中的Lambda函数
这里有一段代码:
lista = [3,4,5,2,1,6,8,3]
print lista # [3, 4, 5, 2, 1, 6, 8, 3]
lista.sort(cmp=lambda x,y: cmp(y,x)) # sort descending
print lista # [8, 6, 5, 4, 3, 3, 2, 1] -- it is sorted
lista = [3,4,5,2,1,6,8,3]
print lista # [3, 4, 5, 2, 1, 6, 8, 3]
lista.sort(cmp=lambda x,y: y > x) # sort descending
print lista # [3, 4, 5, 2, 1, 6, 8, 3] -- nothing happens
为什么第二段代码中的lambda函数没有对数字进行排序呢?
3 个回答
2
x < y 会返回真或假,也就是 True 或 False,而 cmp 则会返回 1 或 -1。下面的代码可以正常运行:
lista.sort(cmp=lambda x,y: 1 if x<y else -1)
8
一个 cmp
函数需要返回一个负数或正数,以表示哪个元素应该排在前面(如果两个元素相等,就返回0)。你现在的 cmp
函数是 y > x
,它只会返回 0
或 1
。试着把它改成下面这样:
lista.sort(cmp=lambda x,y: (y > x) - (y < x))
我从 Python 3 文档中找到的内容:
如果你真的需要
cmp()
的功能,可以用表达式(a > b) - (a < b)
来代替cmp(a, b)
。
21
第二个例子不管用,因为你给的函数不是一个有效的比较器。
一个有效的比较器应该是
根据第一个参数和第二个参数的大小关系,返回一个负数、零或者正数。也就是说,如果第一个参数被认为小于、等于或大于第二个参数,就分别返回负数、零或正数。
而这个函数lambda x,y: y > x
并没有满足这个要求。