官术网_书友最值得收藏!

3.2.6 通過關鍵字排序字典

在操作列表時,對于列表中的元素是字典的情形,我們有時需要根據某個或某幾個字典字段來排序這個列表。

使用operator模塊的itemgetter()函數,可以非常容易地排序這樣的數據結構。

假設從數據庫中檢索出學生的信息列表,并以下列的數據結構返回,代碼如下:


student_info = [
    {'name': 'xiao meng', 'age': 12, 'number': 1003},
    {'name': 'xiao ming', 'age': 12, 'number': 1002},
    {'name': 'xiao zhi', 'age': 11, 'number': 1001},
    {'name': 'xiao li', 'age': 12, 'number': 1004}
]

現根據任意的字典字段來排序輸入結果行,代碼如下:


from operator import itemgetter

student_info = [
    {'name': 'xiao meng', 'age': 12, 'number': 1003},
    {'name': 'xiao ming', 'age': 12, 'number': 1002},
    {'name': 'xiao zhi', 'age': 11, 'number': 1001},
    {'name': 'xiao li', 'age': 12, 'number': 1004}
]

order_by_name = sorted(student_info, key=itemgetter('name'))
order_by_number = sorted(student_info, key=itemgetter('number'))
print(order_by_name)
print(order_by_number)

itemgetter()函數支持多個key,示例如下:


order_by_name_age = sorted(student_info, key=itemgetter('name','age'))
print(order_by_name_age)

在示例中,student_info被傳遞給接收一個關鍵字參數的sorted()內置函數。這個參數是callable類型,從student_info中接收一個單一元素,然后返回被用來排序的值。itemgetter()函數負責創建callable對象。

operator.itemgetter()函數中有一個索引參數,student_info通過這個索引參數從記錄中查找值。索引參數可以是一個字典鍵名稱、一個整型值,也可以是任何能夠傳入__getitem__()方法的值。如果傳入多個索引參數給itemgetter()函數,它生成的callable對象會返回一個包含所有元素值的元組,并且sorted()函數會根據該元組中元素順序去排序。如果想同時在幾個字段上進行排序(比如通過name和age來排序),這種方法是很有用的。

有時候,itemgetter()函數也可以用lambda表達式代替,示例如下:


order_by_name = sorted(student_info, key=lambda r: r['name'])
order_by_age_number = sorted(student_info, key=lambda r: (r['age'],r['number']))
print(order_by_name)
print(order_by_age_number)

使用lambda表達式的方案也不錯,但是使用itemgetter()函數會運行得稍微快點。如果對性能要求比較高,建議使用itemgetter()函數。

這里展示的技術同樣適用于min()和max()等函數,示例如下:


print(min(student_info, key=itemgetter('number')))
print(max(student_info, key=itemgetter('number')))

主站蜘蛛池模板: 扎囊县| 肃宁县| 木里| 白水县| 侯马市| 浏阳市| 吐鲁番市| 舞阳县| 平阴县| 阿瓦提县| 巴里| 拜城县| 昌都县| 杂多县| 南宫市| 莒南县| 临湘市| 濮阳县| 天台县| 正镶白旗| 彭泽县| 三明市| 珲春市| 五大连池市| 金门县| 安西县| 贵州省| 会理县| 宁夏| 磐安县| 晋中市| 成都市| 江西省| 深泽县| 靖西县| 海城市| 西宁市| 噶尔县| 龙州县| 大埔县| 海伦市|