Python 排序不支持原生比较的对象

排序不支持原生比较的对象

问题

想排序类型相同的对象,但是他们不支持原生的比较操作。

解决方法

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() 有个好处,能够同时允许多个字段进行比较,而且相比较下,执行速度快。下面举例同时对多个字段比较,假设实例 Userfirst_namelast_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)
>>>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值