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

猜你喜欢

转载自blog.csdn.net/qq_17753903/article/details/84930107
今日推荐