• python中sort()方法的cmp参数


    《python基础编程》里有讲到一段高级排序:

      “如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素,第5章内对此进行讲解),那么可以通过compare(x,y)的形式自定义比较函数。compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式:

    >>>cmp(42,32)
    1
    >>>cmp(99,100)
    -1
    >>>cmp(10,10)
    0
    >>>numbers = [5,2,9,7]
    >>>numbers.sort(cmp)
    >>>numbers
    [2,5,7,9]

    "

    对于sort()方法,如果不传入参数,默认cmp为None,即numbers.sort()=number,sort(cmp)=number.sort(cmp=None),我们可以做一个验证:

    >>> numbers = [5,2,9,7]
    >>> numbers.sort()
    >>> numbers
    [2, 5, 7, 9]


    >>> numbers = [5,2,9,7]
    >>> numbers.sort(cmp)
    >>> numbers
    [2, 5, 7, 9]


    >>> numbers = [5,2,9,7]
    >>> numbers.sort(cmp=None)
    >>> numbers
    [2, 5, 7, 9]
    >>>

    如果传入参数,numbers.sort(cmp=1),我们可以验证一下,整型的参数可不可以:

    >>> numbers = [5,2,9,7]
    >>> numbers.sort(cmp=1)
    
    Traceback (most recent call last):
      File "<pyshell#91>", line 1, in <module>
        numbers.sort(cmp=1)
    TypeError: 'int' object is not callable
    >>> 

    代码报错:int对象不是一个callable,可调用对象。callable(object) 方法用来检测对象是否可被调用,即是否是一个函数,如果是则调用该函数的值,赋值给cmp。

    那么我们如何自定义一个比较函数呢?

    def mycmp1(x,y):  #升序排列
        return x-y
    def mycmp2(x,y): #降序排列
        return y-x

    其中的规律就是:两两比较,如果返回为正,则交换两者的位置,即y在前x在后,否则x在前y在后。也可以这样解释,升序就是拿第一个数比对后面的数,降序就是拿最后一个数比对前面的数。

    #升序排列
    numbers = [5,2,9,7]
    def mycmp1(x,y):
            return x-y
    numbers.sort(cmp = mycmp1)
    print numbers
    
    >>>
    [2, 5, 7, 9]
    
    #降序排列
    numbers = [5,2,9,7]
    def mycmp2(x,y):
            return y-x
    numbers.sort(cmp = mycmp2)
    print numbers
    
    >>>
    [9,7,5,2]

    当然,也可以写作numbers.sort(mycmp1),省略cmp。

    我们还可以直接穿入匿名函数lambda:

    #升序排列
    numbers = [5,2,9,7]
    numbers.sort(cmp = lambda x,y: x-y)
    print numbers
    
    >>>
    [2,5,7,9]
    
    #降序排列
    numbers = [5,2,9,7]
    numbers.sort(cmp = lambda x,y: y-x)
    print numbers
    
    >>>
    [9,7,5,2]

    另外,python3.x中取消了cmp参数,也不支持直接往sort()里面传函数,但可以构造排序函数传递给key来实现。

  • 相关阅读:
    敏捷开发读后感
    软工第一次作业总结报告
    个人项目作业week5——敏捷开发方法读后感
    结对项目——电梯调度
    个人项目作业
    个人阅读作业3
    个人阅读作业2
    软件工程基础作业-个人项目代码复审
    电梯调度项目总结
    《移山之道》读后感
  • 原文地址:https://www.cnblogs.com/my_captain/p/8678996.html
Copyright © 2020-2023  润新知