python3 sorted 如何實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)
在 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è)類(lèi),在 sorted 內(nèi)部,類(lè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[?] 是固定寫(xiě)法,x其實(shí)可以為任意值。
以上這篇python3 sorted 如何實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python深度學(xué)習(xí)借助多標(biāo)簽分類(lèi)器進(jìn)行對(duì)抗訓(xùn)練
這篇文章主要為大家介紹了python深度學(xué)習(xí)中如何借助多標(biāo)簽分類(lèi)器進(jìn)行對(duì)抗訓(xùn)練,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-01-01
python matplotlib繪圖,修改坐標(biāo)軸刻度為文字的實(shí)例
今天小編就為大家分享一篇python matplotlib繪圖,修改坐標(biāo)軸刻度為文字的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
關(guān)于Python參數(shù)解析器argparse的應(yīng)用場(chǎng)景
這篇文章主要介紹了關(guān)于Python參數(shù)解析器argparse的應(yīng)用場(chǎng)景,argparse 模塊使編寫(xiě)用戶(hù)友好的命令行界面變得容易,程序定義了所需的參數(shù),而 argparse 將找出如何從 sys.argv 中解析這些參數(shù),需要的朋友可以參考下2023-08-08
Django migrate報(bào)錯(cuò)的解決方案
在講解如何解決migrate報(bào)錯(cuò)原因前,我們先要了解migrate做了什么事情,本文就詳細(xì)的介紹migrate使用以及出現(xiàn)問(wèn)題的解決,感興趣的可以了解一下2021-05-05
django orm模糊查詢(xún)、正則匹配多個(gè)值方式
這篇文章主要介紹了django orm模糊查詢(xún)、正則匹配多個(gè)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
python遞歸調(diào)用中的坑:打印有值, 返回卻None
這篇文章主要介紹了python遞歸調(diào)用中的坑:打印有值, 返回卻None,本文通過(guò)問(wèn)題分析給出解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python+OpenCV繪制多instance的Mask圖像
Mask圖像中,不同值表示不同的實(shí)例(instance)。本文將詳細(xì)為大家講講如何利用OpenCV繪制多instance的Mask圖像,感興趣的可以學(xué)習(xí)一下2022-06-06
PyQt5 designer 頁(yè)面點(diǎn)擊按鈕跳轉(zhuǎn)頁(yè)面實(shí)現(xiàn)
本文主要介紹了PyQt5 designer 頁(yè)面點(diǎn)擊按鈕跳轉(zhuǎn)頁(yè)面實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

