- Python進階編程:編寫更高效、優雅的Python代碼
- 劉宇宙 謝東 劉艷
- 586字
- 2021-04-30 12:39:44
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')))
推薦閱讀
- C語言程序設計教程
- Modular Programming with Python
- Apache Oozie Essentials
- 零基礎PHP學習筆記
- 零基礎學Scratch少兒編程:小學課本中的Scratch創意編程
- FreeSWITCH 1.6 Cookbook
- OpenCV for Secret Agents
- Access 2010數據庫基礎與應用項目式教程(第3版)
- Learning Firefox OS Application Development
- 深度強化學習算法與實踐:基于PyTorch的實現
- D3.js 4.x Data Visualization(Third Edition)
- 微服務從小白到專家:Spring Cloud和Kubernetes實戰
- Instant jQuery Boilerplate for Plugins
- Java Web從入門到精通(第2版)
- Android Game Programming by Example