内置sorted函数中cmp参数的正确用法是什么?[python 2.7]
我知道在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 个回答
cmp
是最初用来提供自定义排序顺序的参数,在 Python 2.4 之前,它是唯一的参数。后来引入了 key
,并且从那时起,大家都推荐使用 key
,因为它更高效(其实在 Python 2.4 之前,大家就已经在用一种叫做 Decorate-Sort-Undecorate 的方法来处理排序了;引入 key
是为了让这个过程更简单)。而在 Python 3 中,cmp
的支持完全被移除了。
所以说,cmp
并没有什么单独的使用场景;它只是和 key
一起存在了一段时间,然后就被淘汰了。
根据Python文档的说明:
cmp
是用来指定一个自定义的比较函数,这个函数需要接收两个参数(也就是要比较的元素),并返回一个负数、零或正数。返回的数字表示第一个参数是小于、等于还是大于第二个参数。
当你对一组元素进行排序时,你会把它们互相比较(这取决于排序算法),以确定它们应该按什么顺序排列。这时候,cmp
就派上用场了。
cmp
参数可以接受一个函数作为输入,这个函数需要接收两个参数。这个函数的作用是判断第一个参数是大于、少于还是等于第二个参数。
不过,使用这个方法会非常低效,因为每次比较都需要调用这个函数。
在这个教程中提到的很多内容假设你使用的是 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
函数。