zoukankan      html  css  js  c++  java
  • (转)修改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

  • 相关阅读:
    docker备忘录
    GUAVA-RateLimit
    JDK各版本发展史
    C++ 基础备忘录
    浅谈MES
    MES在流程和离散制造企业的15个差别!
    mysql连接oracle补偿方案—odbc驱动
    WinForm控件Chart的图表类型
    C#的异常处理机制(try...catch...finally)
    oracle 横向列变为纵向列
  • 原文地址:https://www.cnblogs.com/qianyuesheng/p/12800525.html
Copyright © 2011-2022 走看看