排序函数中的Lambda函数

7 投票
3 回答
12158 浏览
提问于 2025-04-17 08:14

这里有一段代码:

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,它只会返回 01。试着把它改成下面这样:

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并没有满足这个要求。

撰写回答