python-進階教程-通過公共鍵對字典列表排序
0.摘要
本文主要介紹基於operator.itemgetter()函式通過公共鍵對字典列表排序的方法,並對operator.itemgetter()做一定介紹。
1.對字典列表排序
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}
]
from operator import itemgetter
rows_by_fname = sorted(rows, key=itemgetter('fname'))
rows_by_uid = sorted(rows, key=itemgetter('uid'))
from pprint import pprint
print("Sorted by fname:")
pprint(rows_by_fname)
print("Sorted by uid:")
pprint(rows_by_uid)
'''
result:
Sorted 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}]
Sorted 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()通過接收一個引數作為查詢的標記,之後將查詢得到的物件傳遞給key引數,是的sorted能夠按照這一物件進行排序。當然,itemgetter()也可以接受多個引數:
rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
print("Sorted by lname,fname:")
pprint(rows_by_lfname)
'''
result:
Sorted by lname,fname:
[{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}]
'''
2.itemgetter()
itemgetter()的引數可以是字典的鍵、列表元素的索引或者任何可以傳給物件的__getiem()方法的值。
比如,我們將rows的keys()提取為一個列表,藉助於itemgetter()可以根據列表元素索引進行排序:
print("==================================")
a = [list(r.values()) for r in rows]
pprint(a)
print("==================================")
rows_by_lfname = sorted(a, key=itemgetter(1,0))
print("Sorted by lname,fname:")
pprint(rows_by_lfname)
'''
result:
==================================
[['Brian', 'Jones', 1003],
['David', 'Beazley', 1002],
['John', 'Cleese', 1001],
['Big', 'Jones', 1004]]
==================================
Sorted by lname,fname:
[['David', 'Beazley', 1002],
['John', 'Cleese', 1001],
['Big', 'Jones', 1004],
['Brian', 'Jones', 1003]]
'''
需要注意的是,這裡把dict.values()轉為list並利用索引排序的方法只是為了演示原理,實際中並不能這麼使用,因為字典是無序的資料結構,真實環境中提取的list與原來的順序不能保證相同。
3.擴充套件
在之前的文章中(https://blog.csdn.net/qq_17753903/article/details/84895311),我們使用lambda表示式為min()和max()函式的key引數提供可呼叫物件,這裡同樣可以藉助lambda表示式實現相同的效果。
rows_by_fname = sorted(rows, key=lambda r: r['fname'])
rows_by_uid = sorted(rows, key=lambda r: r['lname',r['fname']])
當然,min()和max()函式中的key引數,也可以通過itemgetter得到。
相比於lambda表示式,itemgetter()執行效率更高,在考慮效率的情況下,建議使用itemgetter()。
相關文章
- Python實用技法第12篇:通過公共鍵對字典列表排序:itemgetterPython排序
- python-進階教程-對兩個集合/字典求交集、差集、並集Python
- python-進階教程-使用物件屬性進行排序Python物件排序
- python-進階教程-對切片進行命名Python
- 對字典進行排序排序
- Python對字典進行排序Python排序
- python 對字典的值進行排序Python排序
- python-字典Python
- Python 列表與字典 排序 的奇妙之旅Python排序
- 如何在Python中對dicts列表進行排序Python排序
- Python-列表Python
- python-進階教程-根據欄位將記錄分組Python
- python怎麼對字典排序Python排序
- 字串形式的列表,字典轉列表,字典字串
- 進階指南--超快速排序(歸併+逆序對)排序
- 根據字典中值得大小,對字典中的項排序排序
- 分享幾種 Java8 中通過 Stream 對列表進行去重的方法Java
- python-水哥 元祖 字典Python
- Xamarin XAML語言教程通過ProgressTo方法對進度條設定
- 進階篇_map容器(儲存鍵值對)
- python-字典-如何取出字典中的所有值Python
- JAVA將快速將列表分組並排序鍵Java排序
- Arthas 進階教程
- Vim進階教程
- python-資料型別之字典Python資料型別
- python-字典方法(dist)知識整理Python
- python-進階教程-從序列中移除重複項並保持元素順序不變Python
- 通過JNI對C++進行封裝C++封裝
- python字典如何刪除鍵值對Python
- 前端通訊進階前端
- 通過雜湊聯接進行高階優化優化
- RecyclerView進階之層疊列表(上)View
- RecyclerView進階之層疊列表(下)View
- C++11進階知識列表C++
- cookie 中通過 鍵 獲取相對應的 值Cookie
- Python資料型別(數字,字串,[列表],(元組),{字典:字典值},{列表,列表2})Python資料型別字串
- python進階(24)Python字典的底層原理以及字典效率Python
- python 字典排序Python排序