其他分享
首页 > 其他分享> > operater中的itemgetter()和attrgetter()函数

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

作者:互联网

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()类似。

 

标签:rows,uid,operater,lname,attrgetter,user,fname,id,itemgetter
来源: https://www.cnblogs.com/WGJ909001/p/14257302.html