天天看點

Python Cookbook 1.13 通過公共鍵對字典清單排序

有一個清單如下,每一個元素都是字典,這些字典都有一個公共鍵,現在要根據這些公共鍵對這個清單進行排序,怎麼辦?

rows = [
{'fname': 'Brain', 'uid': 1003},
{'fname': 'David', 'uid': 1002},
{'fname': 'John', 'uid': 1001},
{'fname': 'Big', 'uid': 1004}]
           

如果是硬上,做法應該是周遊其中的每一個元素,然後根據每個字典的公共鍵的值的大小重新寫入一個清單,最終得到的結果就是排序之後的結果。

這裡推薦一個 Python 的一個子產品可以免去我們自己寫函數的操作,那就是:

from operator import itemgetter

sorted(rows, key=itemgetter('fname'))
Out[18]: 
[{'fname': 'Big', 'uid': 1004},
 {'fname': 'Brain', 'uid': 1003},
 {'fname': 'David', 'uid': 1002},
 {'fname': 'John', 'uid': 1001}]

#注意,sorted 之後會傳回一個新的字典清單,而不是直接在原清單進行修改
rows
Out[19]: 
[{'fname': 'Brain', 'uid': 1003},
 {'fname': 'David', 'uid': 1002},
 {'fname': 'John', 'uid': 1001},
 {'fname': 'Big', 'uid': 1004}]

#這個操作其實等同于 lambda 的如下用法:
sorted(rows, key=lambda x: x['fname'])
           

如果要考慮輸入多個參數:

sorted(rows, key=itemgetter('fname', 'uud'))
等同于
sorted(rows, key=lambda x: (x['fname'], x['uid']))
           

兩種方法都可以,但是如果考慮到性能問題,應該使用 itemgetter。