首页 > 其他 > 详细

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

时间:2021-01-11 09:29:35      阅读:61      评论: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 版权所有
打开技术之扣,分享程序人生!