可以在类中重写比较函数,然后可以直接使用常规的比较运算符来判断两个对象(都属于这个类)的大小。
Python2中可以直接重写__cmp__
方法来实现比较,但是Python3中已经取消了,Python3中需要细分每一个比较运算符:
__lt__: <
__gt__: >
__ge__: >=
__eq__: ==
__le__: <=
比如,我们可以在 Pos
类中重写这 5 种方法,作为不同 Pos
之间相互比较的规则。
重新定义 Pos
类:
class Pos:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def __str__(self):
return ('(%s, %s)' % (self.x, self.y))
def __lt__(self, other):
return self.x < other.x if self.x != other.x else self.y < other.y
def __gt__(self, other):
return self.x > other.x if self.x != other.x else self.y > other.y
def __ge__(self, other):
return self.x >= other.x if self.x != other.x else self.y >= other.y
def __eq__(self, other):
return self.x == other.x and self.y == other.y
def __le__(self, other):
return self.x <= other.x if self.x != other.x else self.y <= other.y
这样的话,就可以将 Pos
类当做简单的基本类型数值,可以直接进行比较大小,也适用于所有排序方法。
print(Pos(5,1) > Pos(2,4))
print(Pos(5,2) < Pos(5,1))
l4 = sorted(l)
print_list(l4)
结果为:(2, 4),(2, 5),(5, 1)
在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢?
以min函数的定义为例,有两种重载形式:
单参数(一个迭代器):
复制代码 代码如下:
min(iterable[, key=func]) -> value
多参数(多个待比较内容):
复制代码 代码如下:
min(a, b, c, …[, key=func]) -> value
本文主要讨论key=func参数的使用 。举例说明吧:
1.自定义对象的比较
我定义了一个类test,有两个成员变量a和b:
复制代码 代码如下:
class test:
在Python2中可以直接写一个cmp函数作为参数传入sort来自定义排序,但是Python3取消了。
在这里总结一下Python3的自定义排序的两种写法,欢迎补充。
我们以二维空间中的点来作为待排序的数据结构,我们希望能先比较x后再比较y。
class Pos:
def __init__(self, x = 0, y = 0):
当需要查找或插入的元素不存在时,bisect_left和bisect_right、insort_left和insort_right没有区别;bisect_right返回的索引是最后1个出现元素的索引+1。
许多语言(例如C++/Java)的sort函数/方法都支持自定义比较类/函数,Python2的list的sort方法也支持可选参数cmp,支持用户自定义比较函数,但是Python3中删除了可选参数cmp,同时也删除了内置函数cmp,只提供了可选参数key用于自定义排序。但是,有些排序需求用cmp实现较为简单直接,不容易改写成key实现,为此,Python3的functools包提供了cmp_to_...
在编程中经常会遇到自定义对象的排序或者堆维护的问题,这就需要数据结构中的元素可比较大小,由于heapq或者list.sort()都只使用小于<比较,所以只需要定义类的__lt__()方法即可,在Python3中,所有类都有该默认函数,其他函数见下表
此处我们只需要重写该函数, 然后就可以愉快的进行排序比较啦:
class OB():
def __init__(self,n...
Luciano Ramalho 举了这样一个在干草垛中找针的示例来说明如何使用 bisect.bisect 与 bisect.bisect_left。
HAYSTACK = [1, 4, 5, 6, 8, 12, 15,
实际案例:
有时我们希望自定义的类,实例间可以使用 ,>=,==,!= 符号进行比较,我们自定义比较的行为。例如,有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积。
class Rectangle:
def __init__(self, w, h):
self.w =w
self.h = h
def area(se...
在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢?
以min函数的定义为例,有两种重载形式:
单参数(一个迭代器):
min(iterable[, key=func]) -> value
多参数(多个待比较内容):
min(a, b, c, ...[, key=func]) -> value
本文主要讨论
在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢?以min函数的定义为例,有两种重载形式:单参数(一个迭代器):复制代码 代码如下:min(iterable[, key=func]) -> value多参数(多个待比较内容):复制代码 代码如下:min(a, b, c, ...[, key=func]) -> value本文主要...
对于论坛中的帖子,需要根据帖子的点赞数,浏览数和评论数进行排序。三个排序标准的优先级顺序为:点赞数>浏览数>评论数。
也就是说,先按点赞数排序,如果点赞数相等,其次才按浏览数,最后才是评论数。
class Post:
""""""
def __init__(self,postname='',zan_num=0,view_num=0,reply_n