python-進階教程-通過公共鍵對字典列表排序

shangyj17發表於2018-12-09

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()。

相關文章