python数据结构算法题十六:通过某个关键字排序一个字典列表

文章介绍了如何使用Python的operator模块中的itemgetter函数对字典列表按特定字段进行排序,例如按名字或用户ID,以及如何结合多个字段进行排序。
摘要由CSDN通过智能技术生成

问题:

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

解决方案:

通过使用 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
rows_by_fname = sorted(rows, key=itemgetter('fname')) rows_by_uid = sorted(rows, key=itemgetter('uid')) print(rows_by_fname)
print(rows_by_uid)

代码的输出如下:

[{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'},
{'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'},
{'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'}]
[{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'},
{'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
{'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'},
{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'}]

itemgetter() 函数也支持多个 keys,比如下面的代码。

 rows_by_lfname = sorted(rows, key=itemgetter('lname','fname')) print(rows_by_lfname)

会产生如下的输出:

[{'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},
{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'},
{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'},
{'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'}]

rows 被传递给接受一个关键字参数的 sorted() 内置函数。这个 参数是 callable 类型,并且从 rows 中接受一个单一元素,然后返回被用来排序的值。 itemgetter() 函数就是负责创建这个 callable 对象的。

operator.itemgetter() 函数有一个被 rows 中的记录用来查找值的索引参数。可 以是一个字典键名称,一个整形值或者任何能够传入一个对象的 getitem() 方法 的值。

如果你传入多个索引参数给 itemgetter() ,它生成的 callable 对象会返回一 个包含所有元素值的元组,并且 sorted() 函数会根据这个元组中元素顺序去排序。但 你想要同时在几个字段上面进行排序(比如通过姓和名来排序,也就是例子中的那样) 的时候这种方法是很有用的。

>>> min(rows, key=itemgetter('uid'))
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001} >>> max(rows, key=itemgetter('uid'))
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004} >>>
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值