Python3 - 通过关键字排序字典列表
2018-12-16 本文已影响37人
惑也
问题
你有一个字典列表,你想根据某个或某几个字典字段来排序这个列表。
解决方案
通过使用 operator
模块的 itemgetter()
函数,可以非常容易的排序这样的数据结构。 比如数据结构:
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
sort_by_uid = sorted(rows, key=itemgetter('uid'))
sort_by_lname = sorted(rows, key=itemgetter('lname'))
print(sort_by_uid)
print(sort_by_lname)
sort_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}]
sort_by_lname : [{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
itemgetter() 函数也支持多个 keys,比如下面的代码:
sort_by_fname_uid = sorted(rows, key=itemgetter('uid', 'fname'))
print('sort_by_fname_uid : ', sort_by_fname_uid)
sort_by_fname_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()
有时候也可以用 lambda 表达式代替,比如:
sort_by_uid = sorted(rows, key=lambda x: x['uid'])
print('sort_by_uid : ', sort_by_uid)
sort_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()
方式比使用lambda
匿名函数的方式,运行速度稍微快点。因此,如果对性能要求比较高的话就使用 itemgetter() 方式。
本节中的方法,也同样适用于 min() 和 max() 等函数。比如:
max_uid = max(rows, key=itemgetter('uid'))
print(max_uid)
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}