您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)python3中sorted實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)的示例的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
在 python2 中,如果想要自定義評(píng)價(jià)標(biāo)準(zhǔn)的話,可以這么做
def cmp(a, b): # 如果邏輯上認(rèn)為 a < b ,返回 -1 # 如果邏輯上認(rèn)為 a > b , 返回 1 # 如果邏輯上認(rèn)為 a == b, 返回 0 pass a = [2,3,1,2] a = sorted(a, cmp)
但是在 python3 中,cmp 這個(gè)參數(shù)已經(jīng)被移除了,那么在 python3 中應(yīng)該怎么實(shí)現(xiàn) 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)))
上面這個(gè)方法實(shí)現(xiàn)了降序排列,因?yàn)?-1 代表我們邏輯上認(rèn)為 a<b ,而實(shí)際上 b<a 。
追溯 cmp_to_key 的源碼,發(fā)現(xiàn)是這樣的
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
返回的是一個(gè)類,在 sorted 內(nèi)部,類接收一個(gè)參數(shù)構(gòu)造一個(gè)實(shí)例,然后實(shí)例通過(guò)重載的方法來(lái)進(jìn)行比較。
k1 = K(1) k2 = K(2) # 問(wèn)題,k1,k2 誰(shuí)是 self,誰(shuí)是 other # k1 是 self, k2 是 other print(k1 < k2)
補(bǔ)充知識(shí):Python sorted--key參數(shù)用法
sorted(iterable[, key][, reverse])
從 iterable 中的項(xiàng)目返回新的排序列表。
有兩個(gè)可選參數(shù),必須指定為關(guān)鍵字參數(shù)。
key 指定一個(gè)參數(shù)的函數(shù),用于從每個(gè)列表元素中提取比較鍵:key=str.lower。默認(rèn)值為 None (直接比較元素)。
reverse 是一個(gè)布爾值。如果設(shè)置為 True,那么列表元素將按照每個(gè)比較反轉(zhuǎn)進(jìn)行排序。
示例:創(chuàng)建由元組構(gòu)成的列表:a = [('b',3), ('a',2), ('d',4), ('c',1)]
按照第一個(gè)元素排序
sorted(a, key=lambda x:x[0])
>>> [('a',2),('b',3),('c',1),('d',4)]
按照第二個(gè)元素排序
sorted(a, key=lambda x:x[1])
>>> [('c',1),('a',2),('b',3),('d',4)]
key = lambda x:x[?] 是固定寫法,x其實(shí)可以為任意值。
感謝各位的閱讀!關(guān)于“python3中sorted實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。