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}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 迭代对象解压赋值 解压赋值操作可以应用到任何迭代对象上,如:列表、元组、字符串、文件对象、迭代器、生成器。 ...
    faris_shi阅读 4,791评论 0 0
  • 还有几天就要过年了,今年狗年是我的本命年。所以今天抽空把自己的狗窝(房间)打扫一下。 我记得以前曾看过一个日本作家...
    再生香的小书桌阅读 4,108评论 13 21
  • 窗外喜雨逢春,屋内婆姨无眠,随手画河流,印象中的山川,沙漠均在画笔下,接下来画村庄,当然不是现在,巳是凌晨近2点,...
    ry影阅读 1,690评论 8 0
  • 总有一些人与我们擦肩而过,这一辈子,再不可能回眸,彼此微笑着说一声:嗨。和她,应该也不会了…… 6月10号,和好友...
    爱吃糖的毛毛虫阅读 2,915评论 0 0