在 python2 中,sort 和 sorted 可以通過關鍵字引數 cmp 指定排序規則,但在 python3 中這個引數給去掉了:
python2: list.sort(cmp=none, key=none, reverse=false)
python3: list.sort(key=none, reverse=false)
(其中,引數 key 指定帶有乙個引數的函式,用於從每個列表元素中提取比較鍵;引數 reverse 可以指定為逆向排序。)
根據 python3 的文件:
可以使用 functools.cmp_to_key() 將 python2 風格的 cmp 函式轉換為 key 函式。
import functools
strs=[3,4,1,2]
#自定義排序規則
def my_compare(x,y):
if x>y:
return 1
elif x輸出結果:
上面乙個cmp_to_key函式就把cmp函式變成了乙個引數的key函式,那麼這個函式背後究竟做了什麼,看下原始碼就知道了:
def cmp_to_key(mycmp):
"""convert a cmp= function into a key= function"""
class k(object):
__slots__ = ['obj']
def __init__(self, obj):
self.obj = obj
def __lt__(self, other):
return mycmp(self.obj, other.obj) < 0
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __eq__(self, other):
return mycmp(self.obj, other.obj) == 0
def __le__(self, other):
return mycmp(self.obj, other.obj) <= 0
def __ge__(self, other):
return mycmp(self.obj, other.obj) >= 0
__hash__ = none
return k
這段**很巧妙,在函式內部建立了乙個class,並且返回了這個class,在這個class中呼叫了傳入的cmp函式進行了運算子過載。這樣使得兩個class的物件就可以進行比較了。
知乎討論:
參考:參考:
python3自定義函式
一 什麼是函式 函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的 段。函式能提高應用的模組性,和 的重複利用率。你已經知道python提供了許多內建函式,比如print 但你也可以自己建立函式,這被叫做使用者自定義函式。語法def 函式名 引數列表 函式體def func print 王小...
python3 自定義比較函式
python 2 中支援類似 c 中 cmp 的寫法 python 3 放棄了這一用法 官方說明 所以不想寫lambda的話,加一句cmp to key 就行了 def 比較函式 return 原來的方式是 sorted cmp 比較函式 現在的方式是 from functools import c...
python3 自定義比較器
摘要 在一些場景中,需要重新對已有的資料排序,可能所給出的資料型別或者資料數量較多,需要給定排序規則。import functools def by score t1,t2 if t1 0 t2 0 return 1 elif t1 0 t2 1 return 1 elif t1 1 t2 1 re...