有一个列表如下,每一个元素都是字典,这些字典都有一个公共键,现在要根据这些公共键对这个列表进行排序,怎么办?
rows = [
{'fname': 'Brain', 'uid': 1003},
{'fname': 'David', 'uid': 1002},
{'fname': 'John', 'uid': 1001},
{'fname': 'Big', 'uid': 1004}]
如果是硬上,做法应该是遍历其中的每一个元素,然后根据每个字典的公共键的值的大小重新写入一个列表,最终得到的结果就是排序之后的结果。
这里推荐一个 Python 的一个模块可以免去我们自己写函数的操作,那就是:
from operator import itemgetter
sorted(rows, key=itemgetter('fname'))
Out[18]:
[{'fname': 'Big', 'uid': 1004},
{'fname': 'Brain', 'uid': 1003},
{'fname': 'David', 'uid': 1002},
{'fname': 'John', 'uid': 1001}]
#注意,sorted 之后会返回一个新的字典列表,而不是直接在原列表进行修改
rows
Out[19]:
[{'fname': 'Brain', 'uid': 1003},
{'fname': 'David', 'uid': 1002},
{'fname': 'John', 'uid': 1001},
{'fname': 'Big', 'uid': 1004}]
#这个操作其实等同于 lambda 的如下用法:
sorted(rows, key=lambda x: x['fname'])
如果要考虑输入多个参数:
sorted(rows, key=itemgetter('fname', 'uud'))
等同于
sorted(rows, key=lambda x: (x['fname'], x['uid']))
两种方法都可以,但是如果考虑到性能问题,应该使用 itemgetter。