我們知道 Python 的內(nèi)置 dictionary 數(shù)據(jù)類型是無(wú)序的,通過(guò) key 來(lái)獲取對(duì)應(yīng)的 value??墒怯袝r(shí)我們需要對(duì) dictionary 中的 item 進(jìn)行排序輸出,可能根據(jù) key,也可能根據(jù) value 來(lái)排。到底有多少種方法可以實(shí)現(xiàn)對(duì) dictionary 的內(nèi)容進(jìn)行排序輸出呢?下面摘取了使用 sorted 函數(shù)實(shí)現(xiàn)對(duì) dictionary 的內(nèi)容進(jìn)行排序輸出一些精彩的解決辦法。
1. sorted函數(shù)按key值對(duì)字典排序
先基本介紹一下 sorted 函數(shù),sorted(iterable,key,reverse)
,sorted一共有 iterable
,key
,reverse
這三個(gè)參數(shù)。
其中 iterable 表示可以迭代的對(duì)象,例如可以是 dict.items()、dict.keys()等。
key 是一個(gè)函數(shù),用來(lái)選取參與比較的元素。
reverse 則是用來(lái)指定排序是倒序還是順序,reverse=true 則是倒序,reverse=false 時(shí)則是順序,默認(rèn)時(shí) reverse=false。
要按key值對(duì)字典排序,則可以使用如下語(yǔ)句:
In [1]: d = {"lilee":25, "wangyuan":21, "liquan":32, "zhangsan":18, "lisi":28}In [2]: sorted(d.keys())Out[2]: ['lilee', 'liquan', 'lisi', 'wangyuan', 'zhangsan']
直接使用 sorted(d.keys())
就能按 key 值對(duì)字典排序,這里是按照順序?qū)?key 值排序的,如果想按照倒序排序的話,則只要將 reverse 置為 true 即可。
2. sorted函數(shù)按value值對(duì)字典排序
在 python2.4 前,sorted() 和 list.sort() 函數(shù)沒(méi)有提供 key 參數(shù),但是提供了 cmp 參數(shù)來(lái)讓用戶指定比較函數(shù)。此方法在其他語(yǔ)言中也普遍存在。
在 python2.x 中 cmp 參數(shù)指定的函數(shù)用來(lái)進(jìn)行元素間的比較。此函數(shù)需要 2 個(gè)參數(shù),然后返回負(fù)數(shù)表示小于,0 表示等于,正數(shù)表示大于。
在 python3.0 中,cmp 參數(shù)被徹底的移除了,從而簡(jiǎn)化和統(tǒng)一語(yǔ)言,減少了高級(jí)比較和 __cmp__
方法的沖突。
cmp 參數(shù)(python3 中已經(jīng)被移除,不推薦)
In [3]: sorted(d.items(), lambda x, y: cmp(x[1], y[1]), reverse=True)Out[3]: [('liquan', 32), ('lisi', 28), ('lilee', 25), ('wangyuan', 21), ('zhangsan', 18)]
key 參數(shù)(推薦)
In [4]: sorted(d.items(), key=lambda item:item[1], reverse=True)Out[4]: [('liquan', 32), ('lisi', 28), ('lilee', 25), ('wangyuan', 21), ('zhangsan', 18)]
這里的
d.items()
實(shí)際上是將 d 轉(zhuǎn)換為可迭代對(duì)象,迭代對(duì)象的元素為('liquan', 32)、('lisi', 28)、......、('zhangsan', 18)
。items() 方法將字典的元素轉(zhuǎn)化為了元組,而這里 key 參數(shù)對(duì)應(yīng)的 lambda 表達(dá)式的意思則是選取元組中的第二個(gè)元素作為比較參數(shù)(如果寫作
key=lambda item:item[0]
的話則是選取第一個(gè)元素作為比較對(duì)象,也就是 key 值作為比較對(duì)象。lambda x:y
中 x 表示輸出參數(shù),y 表示 lambda 函數(shù)的返回值),所以采用這種方法可以對(duì)字典的 value 進(jìn)行排序。注意排序后的返回值是一個(gè) list,而原字典中的名值對(duì)被轉(zhuǎn)換為了 list 中的元組。