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

  • 相关阅读:
    mac/unix系统:C++实现一个端口扫描器
    C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
    PostMan Setting Proxy 设置 代理
    企业架构 Red Hat Drools KIE Project 三大核心产品
    IDS,IPS,IPD
    Vehicle routing with Optaplanner graph-theory
    SonarQube Detection of Injection Flaws in Java, C#, PHP
    Spring AOP Log
    Code Quality and Security | SonarQube
    Gradle vs. Maven: Performance, Compatibility, Speed, & Builds
  • 原文地址:https://www.cnblogs.com/qianyuesheng/p/12800525.html
Copyright © 2011-2022 走看看