内置sorted函数中cmp参数的正确用法是什么?[python 2.7]

1 投票
3 回答
1514 浏览
提问于 2025-04-18 09:38

我知道在sorted()这个函数里,还有三个额外的参数:cmp、key和reverse。

我对key和reverse的用法很熟悉。key可以快速对一个包含多个子项的列表进行排序,而reverse则是简单地把结果反转过来。例如:

>>> L1 = [('mama','1'),('papa','2'),('son','0')]
>>> L1 = sorted(L1, key = lambda x: x[1], reverse = True)
>>> L1
[('papa', '2'), ('mama', '1'), ('son', '0')]

不过到目前为止,我还没弄明白怎么正确使用cmp这个参数,尽管我看过官方文档。有没有人能给我一个关于sorted()中cmp参数的好用例子呢?

3 个回答

1

cmp 是最初用来提供自定义排序顺序的参数,在 Python 2.4 之前,它是唯一的参数。后来引入了 key,并且从那时起,大家都推荐使用 key,因为它更高效(其实在 Python 2.4 之前,大家就已经在用一种叫做 Decorate-Sort-Undecorate 的方法来处理排序了;引入 key 是为了让这个过程更简单)。而在 Python 3 中,cmp 的支持完全被移除了。

所以说,cmp 并没有什么单独的使用场景;它只是和 key 一起存在了一段时间,然后就被淘汰了。

1

根据Python文档的说明:

cmp是用来指定一个自定义的比较函数,这个函数需要接收两个参数(也就是要比较的元素),并返回一个负数、零或正数。返回的数字表示第一个参数是小于、等于还是大于第二个参数。

当你对一组元素进行排序时,你会把它们互相比较(这取决于排序算法),以确定它们应该按什么顺序排列。这时候,cmp就派上用场了。

2

cmp 参数可以接受一个函数作为输入,这个函数需要接收两个参数。这个函数的作用是判断第一个参数是大于、少于还是等于第二个参数。

不过,使用这个方法会非常低效,因为每次比较都需要调用这个函数。

引用自 Python - Sorting wiki

在这个教程中提到的很多内容假设你使用的是 Python 2.4 或更高版本。在那之前,没有 sorted() 这个内置函数,而 list.sort() 也不支持关键字参数。相反,所有的 Py2.x 版本都支持一个 cmp 参数,用来处理用户自定义的比较函数。

在 Py3.0 中,cmp 参数被完全移除了(这是为了简化和统一语言的一部分,消除了丰富比较和 __cmp__ 方法之间的冲突)。

在 Py2.x 中,排序允许一个可选的函数来进行比较。这个函数应该接收两个要比较的参数,然后返回一个负值表示第一个参数小于第二个,返回零表示它们相等,或者返回一个正值表示第一个参数大于第二个。例如,我们可以这样做:

>>> def numeric_compare(x, y):
        return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]

注意:在 Python 2.7 中,我们有一个叫做 functools.cmp_to_key 的函数,可以用来将 cmp 函数转换为 key 函数。

撰写回答