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