python通過公共鍵對字典列表排序
阿新 • • 發佈:2019-01-31
本人的程式碼是基於python3.6的。
有時我們想在一個字典列表中,根據某一個或多個字典中的值來對該列表字典排序。
通常有這樣一個數據結構:
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1},
{'fname': 'Dacid', 'lname': 'Bee', 'uid': 7},
{'fname': 'Jone', 'lname': 'Cleece', 'uid': 5},
{'fname': 'Big', 'lname': 'Jones', 'uid': 3}
]
根據所有字典中任一共有欄位是非常簡單的,示例如下:
from operator import itemgetter
rows_by_fname = sorted(rows, key=itemgetter('fname'))
print(rows_by_fname)
程式碼輸出為:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 3}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1}, {'fname': 'Dacid', 'lname': 'Bee', 'uid': 7}, {'fname': 'Jone', 'lname': 'Cleece', 'uid': 5}]
itemgetter()函式還可以接受多個鍵。
rows_by_lname = sorted(rows, key=itemgetter('fname', 'lname'))
print(rows_by_lname)
結果輸出如下:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 3}, {'fname': 'Brian', 'lname': 'Jones', 'uid': 1}, {'fname': 'Dacid', 'lname': 'Bee', 'uid': 7}, {'fname': 'Jone', 'lname': 'Cleece', 'uid': 5}]
在這個例子中,rows被傳遞給內建的函式sorted,該函式接受一個關鍵字引數key。這個引數代表一個可被呼叫的物件,該物件從rows中接受一個單獨的元素作為輸入並返回一個用來做排序依據的值。
函式operator.itemgetter()接受的引數可作為查詢的標記,用來從rows的記錄中提取出所需要的值。它可以是字典的鍵名稱、用數字表示的列表元素或是任何可以傳給物件的__getitem__()方法的值。
有時會用lambda表示式來取代itemgetter()功能。
rows_by_lname = sorted(rows, key=lambda r: r['lname'])
print(rows_by_lname)
同樣,在特別情況下也適用max()和min()這樣的函式。
rows_by_uid = min(rows, key=lambda r: r['uid'])
print(rows_by_uid)
rows_by_uid = max(rows, key=lambda r: r['uid'])
print(rows_by_uid)