如何解决排序不支持原生比较的对象的问题?

内置的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)

>>>

未经允许不得转载:惠生活366 » 如何解决排序不支持原生比较的对象的问题?

赞 (0) 打赏