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

时间:2014-06-13 03:32:56

标签: python sorting

我知道sorted()中还有三个附加参数:cmp,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 个答案:

答案 0 :(得分:2)

cmp参数接受一个函数作为参数,它接受两个参数。无论第一项是否大于,小于或等于第二项,该函数都应返回。

但使用它将是非常低效的,因为必须为每次比较调用它。

引自Python - Sorting wiki

  

本HOWTO中给出的许多结构都假定为Python 2.4或更高版本。在此之前,没有sorted()内置,list.sort()没有关键字参数。相反,所有Py2.x版本都支持cmp参数来处理用户指定的比较函数。

     

在Py3.0中,cmp参数被完全删除(作为简化和统一语言的更大努力的一部分,消除了丰富的比较和__cmp__方法之间的冲突)。 p>      

在Py2.x中,sort允许一个可选函数,可以调用它来进行比较。该函数应该采用两个参数进行比较,然后返回负值为小于,如果它们相等则返回零,或者返回大于大于的正值。例如,我们可以这样做:

>>> 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函数。

答案 1 :(得分:1)

根据Python Docs

  

cmp指定两个参数(可迭代元素)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否被认为小于,等于或大于第二个参数

当您对一组元素进行排序时,将它们相互比较(这取决于排序算法),以尝试确定它们将按什么顺序排序。这是cmp采取行动的地方。

答案 2 :(得分:1)

cmp是用于提供自定义排序顺序的原始参数,并且是在Python 2.4中引入key之前的 only 参数。 key一直被推荐cmp更高效(甚至在Python 2.4之前,鼓励Decorate-Sort-Undecorate成语;引入key参数以简化其实现),并且在Python 3中完全删除了对cmp的支持。

因此,cmp没有单独的用例;在离开之前,它与key共存了一段时间。