排序不支持原生比较的对象
问题
想排序类型相同的对象,但是他们不支持原生的比较操作。
解决方法
Python 内置的 sorted()
函数能够进线排序,其中有一个关键字参数 key
,可以传入一个 callable
对象给它,然后 callable
对象对每个传入的对象返回一个值,这个值会被 sorted
用来排序这些对象。假设,有一个 User
实例,并且希望通过属性 user_id
进行排序,这里就可以提供以实例为输入并输出对应 user_id
值的 callable
对象。示例如下:
class User(object):
def __init__(self, user_id):
self.user_id = user_id
def __repr__(self):
return 'User({})'.format(self.user_id)
def sort_not_compare():
users = [User(23),User(3),User(99)]
print(users)
print(sorted(users, key=lambda u:u.user_id))
这里还有种方法能够替代 lambda 函数,用 operator.attrgetter()
:
>>> from operator import attrgetter
>>> sorted(users, key=attrgetter('user_id'))
[User(3),User(23),User(99)]
>>>
代码解析
上面提及的是否用 operator.attrgetter()
代替 lambda 函数,这个看个人喜好。但,attrgetter()
有个好处,能够同时允许多个字段进行比较,而且相比较下,执行速度快。下面举例同时对多个字段比较,假设实例 User
有 first_name
和 last_name
两个属性,则:
by_name = sorted(users, key=attrgetter('last_name', 'first_name'))
本篇的技术也适用于 max()
和 min()
之类的函数,例如:
>>> min(users, key=attrgetter('user_id'))
User(3)
>>> max(users, key=attrgetter('user_id'))
User(99)
>>>
网友评论