Python sorted:對(duì)自定義的數(shù)據(jù)結(jié)構(gòu)排序

Python 內(nèi)置的sorted的函數(shù)可以用來(lái)對(duì)自定義的數(shù)據(jù)結(jié)構(gòu)(列表)(設(shè)該列表為myList)排序,用法如下。


首先上定義。

Python 2下參數(shù)列表:sorted(iterable, cmp, key, reverse)

Python 3下參數(shù)列表:sorted(iterable, key, reverse)


Python 2 下分兩步:

1. 對(duì)于自定義的數(shù)據(jù)結(jié)構(gòu)可以重寫(xiě)一個(gè)cmp函數(shù):

def compare(item1, item2):

?? {某種比較方式,得出表示大或小的布爾值}

? ? return 表示大或小的布爾值

2.調(diào)用sorted:

myList = sorted(myList, cmp = compare) # reverse的設(shè)置視需要而定


Python 3 下分兩步:

1. 對(duì)于自定義的數(shù)據(jù)結(jié)構(gòu)可以重寫(xiě)一個(gè)getKeyValue函數(shù):

def getKeyValue(item):

??? keyValue ={對(duì)于MyList的元素item,獲得用于比較的鍵值}

? ? return keyValue

2.調(diào)用sorted:

myList = sorted(myList, key = getKeyValue) # reverse的設(shè)置視需要而定


小結(jié):

對(duì)于像我這種從C/C++過(guò)來(lái)的程序員,使用sorted時(shí)會(huì)自然地想到要去重寫(xiě)cmp函數(shù),這在Python 2 環(huán)境下是沒(méi)有問(wèn)題的。但為了簡(jiǎn)化和統(tǒng)一,Python 3去掉了sorted()方法中的cmp參數(shù),使得重寫(xiě)cmp函數(shù)的辦法失效,如果一定要重寫(xiě)cmp,可以用functools.cmp_to_key()來(lái)曲線救國(guó),具體可以參考鏈接:Python3: 找回sort()中消失的cmp參數(shù) - Penguin 。

不過(guò),由于Python 2 的語(yǔ)法中sorted的同樣包含了key這個(gè)參數(shù),所以Python 3下的方法應(yīng)當(dāng)是同樣適用于Python 2的。

對(duì)于Python 3 中的key這個(gè)參數(shù),網(wǎng)上有一些文章解釋了這個(gè)參數(shù)是什么,以及如何用,在此不多贅述,但如果自己寫(xiě)的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜,建議還是手動(dòng)寫(xiě)getKeyValue以免出錯(cuò)。key = getKeyValue 把自己寫(xiě)的方法名 ‘getKeyValue’? 傳給key,這樣就可以用自己的方法來(lái)獲取用于比較的鍵值。

舉個(gè)例子,假設(shè)要對(duì)某些商品按照其價(jià)格進(jìn)行排序,商品存在myList中——myList是一個(gè)list,其中l(wèi)ist的每個(gè)元素(item)是一個(gè)series。元素(item)示例如下:


weight? 200.00g

shop?? XX配件專(zhuān)營(yíng)店

name? USB有線鼠標(biāo)臺(tái)式電腦筆記本通用 黑色

price?? ¥,1.28


這里,價(jià)格是像 ‘¥,1.28’ 這樣的字符串,那么我們可以寫(xiě)一個(gè)getPrice來(lái)獲取每個(gè)item的價(jià)格:

def getPrice(item):

? ? return float(item['price'][2:])

然后調(diào)用sorted

myList = sorted(myList, key = getPrice)

即可獲得正確排序結(jié)果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容