Python3 自定義 sort 的排序規則

2021-10-23 09:20:39 字數 1420 閱讀 8069

在 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...