Python3 - 通过关键字排序字典列表

问题

你有一个字典列表,你想根据某个或某几个字典字段来排序这个列表。

解决方案

通过使用 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}

推荐阅读更多精彩内容