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