首页 > 其他 > 详细

operater中的itemgetter()和attrgetter()函数

时间:2021-01-11 09:29:35      阅读:54      评论:0      收藏:0      [点我收藏+]

1、对于字典列表,想根据一个或多个字典中的值对列表进行排序,可以使用itemgetter():

rows=[
    {fname:Brain,lname:Jones,uid:1003},
    {fname:David,lname:Beazley,uid:1002},
    {fname:John,lname:Cleese,uid:1001},
    {fname:Big,lname:Jone,uid:1004}
]

from operator import itemgetter
rows_by_fnames=sorted(rows,key=itemgetter(‘fname‘))
rows_by_uid=sorted(rows,key=itemgetter(‘uid‘))
print(rows_by_fnames)
print(‘\n‘)
print(rows_by_uid)
print(‘\n‘)
rows_by_lfname=sorted(rows,key=itemgetter(‘lname‘,‘fname‘))
print(rows_by_lfname)
[{fname: Big, lname: Jone, uid: 1004}, {fname: Brain, lname: Jones, uid: 1003}, {fname: David, lname: Beazley, uid: 1002}, {fname: John, lname: Cleese, uid: 1001}] [{fname: John, lname: Cleese, uid: 1001}, {fname: David, lname: Beazley, uid: 1002}, {fname: Brain, lname: Jones, uid: 1003}, {fname: Big, lname: Jone, uid: 1004}]

[{‘fname‘: ‘David‘, ‘lname‘: ‘Beazley‘, ‘uid‘: 1002}, {‘fname‘: ‘John‘, ‘lname‘: ‘Cleese‘, ‘uid‘: 1001}, {‘fname‘: ‘Big‘, ‘lname‘: ‘Jone‘, ‘uid‘: 1004}, {‘fname‘: ‘Brain‘, ‘lname‘: ‘Jones‘, ‘uid‘: 1003}]

我们也可以用lambda表达式来代替itemgetter():
rows_by_fname=sorted(rows,key=lambda r:r[fname])
rows_by_lfname=sorted(rows,key=lambda r:(r[lname],r[fname]))

但是itemgetter()通常会更快一点。这些方法通常也可以用于min()和max()。

 2、我们想在同一个类的实例之间做排序,但是他们并不原生支持比较操作。内建的sorted()函数可以接受一个用来传递可调用对象的参数key,该可调用对象会返回待排序对象的某些值,sorted()则利用这些值来比较对象。如下示例。

class User:
    def __init__(self,user_id):
        self.user_id=user_id
    def repr(self):
        return User({}).format(self.user_id)
users=[User(23),User(66),User(9)]
for user in users:
    print(user.user_id)
23
66
9

使用sort()函数排序:

users.sort(key=lambda u:u.user_id)
for user in users:
    print(user.user_id)

9
23
66

使用operator.attrgetter():

from operator import attrgetter
users.sort(key=attrgetter(user_id))
for user in users:
    print(user.user_id)

9
23
66

lambda() 和attrgetter()都可以实现效果,但是attrgetter()要快一些,且能同时提取多个属性,这和针对字典的itemgetter()类似。

 

operater中的itemgetter()和attrgetter()函数

原文:https://www.cnblogs.com/WGJ909001/p/14257302.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!