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)可以重寫一個(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)可以重寫一個(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ì)自然地想到要去重寫cmp函數(shù),這在Python 2 環(huán)境下是沒(méi)有問(wèn)題的凤粗。但為了簡(jiǎn)化和統(tǒng)一绘面,Python 3去掉了sorted()方法中的cmp參數(shù),使得重寫cmp函數(shù)的辦法失效侈沪,如果一定要重寫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ù)是什么燥筷,以及如何用箩祥,在此不多贅述,但如果自己寫的數(shù)據(jù)結(jié)構(gòu)比較復(fù)雜肆氓,建議還是手動(dòng)寫getKeyValue以免出錯(cuò)袍祖。key = getKeyValue 把自己寫的方法名 ‘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配件專營(yíng)店
name? USB有線鼠標(biāo)臺(tái)式電腦筆記本通用 黑色
price?? ¥,1.28
這里,價(jià)格是像 ‘¥,1.28’ 這樣的字符串患民,那么我們可以寫一個(gè)getPrice來(lái)獲取每個(gè)item的價(jià)格:
def getPrice(item):
? ? return float(item['price'][2:])
然后調(diào)用sorted
myList = sorted(myList, key = getPrice)
即可獲得正確排序結(jié)果缩举。