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è)類,在 sorted 內(nèi)部,類接收一個(gè)參數(shù)構(gòu)造一個(gè)實(shí)例,然后實(shí)例通過重載的方法來進(jìn)行比較。
k1 = K(1) k2 = K(2) # 問題,k1,k2 誰是 self,誰是 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í)可以為任意值。
以上這篇python3 sorted 如何實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python實(shí)現(xiàn)廣告點(diǎn)擊率預(yù)測(cè)
廣告點(diǎn)擊率是指有多少用戶點(diǎn)擊了您的廣告與有多少用戶查看了您的廣告的比率,本文主要為大家介紹了如何使用Python實(shí)現(xiàn)廣告點(diǎn)擊率預(yù)測(cè),感興趣的小伙伴可以了解下2023-10-10
解決Jupyter notebook更換主題工具欄被隱藏及添加目錄生成插件問題
這篇文章主要介紹了解決Jupyter notebook更換主題工具欄被隱藏及添加目錄生成插件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python調(diào)用百度AI實(shí)現(xiàn)顏值評(píng)分功能
這篇文章主要介紹了應(yīng)用百度AI的人臉識(shí)別功能對(duì)年齡、性別、顏值等進(jìn)行識(shí)別,代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的朋友跟隨小編一起看看吧2021-11-11
TensorFlow實(shí)現(xiàn)批量歸一化操作的示例
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)批量歸一化操作的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python保留數(shù)據(jù)并刪除Excel單元格的函數(shù)和公式
在分析處理Excel表格時(shí),我們可能需要使用各種公式或函數(shù)對(duì)表格數(shù)據(jù)進(jìn)行計(jì)算,從而分析出更多的信息,但在展示、分享或再利用分析結(jié)果時(shí),我們可能需要將含有公式的單元格轉(zhuǎn)換為靜態(tài)數(shù)值,本文將介紹如何使用Python代碼批量移除Excel單元格中的公式并保留數(shù)值2024-10-10
linux系統(tǒng)使用python監(jiān)控apache服務(wù)器進(jìn)程腳本分享
這篇文章主要介紹了linux系統(tǒng)使用python監(jiān)控apache服務(wù)器進(jìn)程的腳本,大家參考使用吧2014-01-01

