• (转)修改python默认排序方式


    在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)
    也可以正确排序。
    ————————————————
    版权声明:本文为CSDN博主「Setsuna_Ogiso」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Setsuna_Ogiso/java/article/details/85041331

  • 相关阅读:
    Spring读书笔记
    window.open参数详解
    在spring security3上实现验证码
    Struts2.1 标签详细说明
    总结一下log4j
    【转】hibernate映射oracle自增长
    Java中四舍五入保留七位小数
    求三个整数的最小公倍数
    boxshadow 曲线阴影和翘边阴影
    <div> <p> <span>的用法和区别
  • 原文地址:https://www.cnblogs.com/qianyuesheng/p/12800525.html
Copyright © 2020-2023  润新知