Python使用内置sorted()函数对自定义类实例排序的两种方法

     在Java中,自定义类可以通过继承comparable接口,重写compareTo方法来使用内置sort()函数来对自定义对象排序,我就在想Python中有没有类似的操作。

    首先随便写个自定义类,比如说我写了个“分数”类,成员变量包括分子、分母和分数的值,后面我们根据值来对分数排序。代码如下:

class Frac:
    def __init__(self, upper, lower):
        self.upper = upper
        self.lower = lower
        self.value = upper / lower

    def __str__(self):
        return "{}/{}".format(self.upper, self.lower)

经过一顿摸索,首先我试了试直接对自定义对象的list调用sorted()函数

a, b, c = Frac(1, 2), Frac(1, 4), Frac(1, 3)
l = [a, b, c]
l = sorted(l)
for i in l:
    print(str(i))

结果报错:

TypeError: '<' not supported between instances of 'Frac' and 'Frac'

原来只要定义对象之间的“<”操作符就可以了,也就是重写__lt__方法,感觉和Java里面重写compareTo的方法比较像。于是在类的代码里面加上一段:

    def __lt__(self, other):
        if self.value < other.value:
            return True
        else:
            return False

再次运行,运行结果:

问题解决。

    另外还有一种方法,就是指定sorted函数的key参数,key参数接收一个函数作为参数,来指定排序的key,通常用lambda表达式就行了,比如上文中,不用重写__lt__方法,在调用sorted函数的时候加上key参数:

sorted(l, key=lambda x: x.value)

也可以正确排序。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值