python3 sorted 如何實現自定義排序標準
阿新 • • 發佈:2020-03-12
在 python2 中,如果想要自定義評價標準的話,可以這麼做
def cmp(a,b): # 如果邏輯上認為 a < b ,返回 -1 # 如果邏輯上認為 a > b,返回 1 # 如果邏輯上認為 a == b,返回 0 pass a = [2,3,1,2] a = sorted(a,cmp)
但是在 python3 中,cmp 這個引數已經被移除了,那麼在 python3 中應該怎麼實現 python2 的 cmp 功能呢?
import functools def cmp(a,b): if b < a: return -1 if a < b: return 1 return 0 a = [1,2,5,4] print(sorted(a,key=functools.cmp_to_key(cmp)))
上面這個方法實現了降序排列,因為 -1 代表我們邏輯上認為 a<b ,而實際上 b<a 。
追溯 cmp_to_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.obj) > 0 def __eq__(self,other.obj) == 0 def __le__(self,other.obj) <= 0 def __ge__(self,other.obj) >= 0 __hash__ = None return K
返回的是一個類,在 sorted 內部,類接收一個引數構造一個例項,然後例項通過過載的方法來進行比較。
k1 = K(1) k2 = K(2) # 問題,k1,k2 誰是 self,誰是 other # k1 是 self, k2 是 other print(k1 < k2)
補充知識:Python sorted--key引數用法
sorted(iterable[,key][,reverse])
從 iterable 中的專案返回新的排序列表。
有兩個可選引數,必須指定為關鍵字引數。
key 指定一個引數的函式,用於從每個列表元素中提取比較鍵:key=str.lower。預設值為 None (直接比較元素)。
reverse 是一個布林值。如果設定為 True,那麼列表元素將按照每個比較反轉進行排序。
示例:建立由元組構成的列表:a = [('b',3),('a',2),('d',4),('c',1)]
按照第一個元素排序
sorted(a,key=lambda x:x[0])
>>> [('a',('b',1),4)]
按照第二個元素排序
sorted(a,key=lambda x:x[1])
>>> [('c',4)]
key = lambda x:x[?] 是固定寫法,x其實可以為任意值。
以上這篇python3 sorted 如何實現自定義排序標準就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。