内置的sorted()函数有一个关键字参数key,可以传入一个callable对象给它,这个callable对象对每个传入的对象返回一个值,这个值会被sorted用来排序这些对象。比如,如果你在应用程序里面有一个User实例序列,并且你希望通过他们的user_id属性进行排序,你可以提供一个以User实例作为输入并输出对应user_id值的callable对象。比如:
class User:
def__init__(self, user_id):
self.user_id= user_id def__repr__(self):
return’User({})’.format(self.user_id)
def sort_notcompare():
users=[User(23), User(3), User(99)] print(users)
print(sorted(users, key=lambda u: u.user_id))
另外一种方式是使用operator.attrgetter()来代替lambda函数:>>> from operator import attrgetter
>>> sorted(users, key=attrgetter(‘user_id’))[User(3), User(23), User(99)]
>>>讨论
选择使用lambda函数或者是attrgetter()可能取决于个人喜好。但是,attrgetter()函数通常会运行的快点,并且还能同时允许多个字段进行比较。这个跟operator.itemgetter()函数作用于字典类型很类似(参考1.13小节)。例如,如果User实例还有一个first_name和last_name属性,那么可以向下面这样排序:by_name= sorted(users, key=attrgetter(‘last_name’,’first_name’))
同样需要注意的是,这一小节用到的技术同样适用于像min()和max()之类的函数。比如:
>>> min(users, key=attrgetter(‘user_id’)) User(3)
>>> max(users, key=attrgetter(‘user_id’)) User(99)
>>>