python中sort()方法的cmp參數

《python基礎編程》裏有講到一段高級排序:python

  「若是但願元素能按照特定的方式進行排序(而不是sort函數默認的方式,即根據python的默認排序規則按升序排列元素,第5章內對此進行講解),那麼能夠經過compare(x,y)的形式自定義比較函數。compare(x,y)函數會在x<y時返回負數,在x>y時返回正數,若是x=y則返回0(根據你的定義)。定義好該函數以後,就能夠提供給sort方法做爲參數了。內建函數cmp提供了比較函數的默認實現方式:shell

>>>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),咱們能夠作一個驗證:python3.x

 

>>> 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]spa


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

 

若是傳入參數,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。blog

那麼咱們如何自定義一個比較函數呢?排序

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來實現。

相關文章
相關標籤/搜索