1. 程式人生 > >python通過公共鍵對字典列表排序

python通過公共鍵對字典列表排序

本人的程式碼是基於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)