任務
你想對字典排序。這可能意味著需要先根據字典的鍵排序,然后再讓對應值也處于同樣的順序。
解決方案
最簡單的方法可以通過這樣的描述來概括:先將鍵排序,然后由此選出對應值:
def sortedDictValues(adict):keys = adict.keys()keys.sort()return [adict[key] for key in keys]
討論
排序的概念僅僅適用于那些有順序的集——換句話說,一個序列。而一個映射,比如字典,是沒有順序的,因此它無法被排序。然而,“我怎么才能將一個字典排序”是Python 郵件列表中一個很常見的問題,理論上這個問題沒有什么意義。在絕大多數情況下,其實際目的是將字典中的鍵構成的序列排序。
至于實現部分,一些人總是考慮更復雜的方式,但其實解決方案中給出的最簡單的方法也是最快的方法(對 Python 來說,這樣的情況并不少見)。在Python 2.3中,在函數的最后的 return 語句中,將列表推導轉換成對 map 的調用還可以獲得一些速度的提升,大約 20%。比如:
return map(adict.get,keys)
解決方案中的代碼在 Python 2.4 下已經比 Python2.3要快了,按照上面的方式進行改寫也不會獲得很大的速度提升。而使用其他方法,比如用adict.__getitem__來代替adict.get,并不會提供任何性能的提升,反而會引起性能的些微下降,無論是在Python2.3 還是 2.4 中。