問題描述
你有一個字典串列,你想根據某個或某幾個字典欄位來排序這個串列,
解決方案
通過使用operator模塊的itemgetter函式,可以實作這樣的排序,例如:
from operator import itemgetter
rows = [
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]
rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
print(rows_by_fname)
"""輸出結果
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
"""
print(rows_by_uid)
"""輸出結果
[{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
"""
# itemgetter()函式也支持多個keys
rows_by_lfname = sorted(rows, key=itemgetter('lname', 'fname'))
print(rows_by_lfname)
"""輸出結果
[{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}]
"""
討論
在上面的例子中,字典串列rows被傳遞給接受一個關鍵字引數的內置函式sorted(),這個引數是callable型別,并且從rows中接受一個單一元素,然后回傳被用來排序的值,itemgetter()函式就是負責創建這個callable物件的,
operator.itemgetter()函式有一個索引引數,可以被rows用來查找值,它可以是一個字典鍵名稱,一個整型值或者任何能夠傳入一個物件的__getitem__()方法的值,如果你傳入多個索引引數給itemgetter(),它生成的callable物件會回傳一個包含所有元素值的元組,并且sorted()函式會根據這個元組中元素順序去排序,
itemgetter()也可以用lambda代替:
rows_by_fname = sorted(rows, key=lambda r: r['fname'])
rows_by_lfname = sorted(rows, key=lambda r: (r['lname'],r['fname']))
但是使用itemgetter()會運行的更快些,如果你對性能有要求,就是用itemgetter(),
當然,這也同樣適用于min()和max()等函式,比如:
min(rows, key=itemgetter('uid')) # {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}
max(rows, key=itemgetter('uid')) # {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/396045.html
標籤:Python
