- 以下定义了interval类,并实现了对其排序
- 利用两种方法,1)自定义
__lt__()
,2)定义sort()
的key参数 - 重写
__str__()
方便我输出 if __name__ == "__main__":
是为了仅我这个程序运行main- 要点全部写在注释里面了
# python自定义多关键字排序
# 重写__lt__方法
# 定义key
# 假设我有一组interval需要排序
class Interval:
def __init__(self, left, right):
self.left = left
self.right = right
# 以下为重写的__lt__方法
def __lt__(self, other):
# 当两个Interval比较大小时,直接比较它们的left属性
# 如果left属性相等,则比较right属性
if self.left < other.left:
return True
elif self.left == other.left:
return self.right < other.right
else:
return False
# 如果要把一个类的实例变成 str,就需要实现特殊方法__str__():
# Python 定义了__str__()和__repr__()两种方法,__str__()用于显示给用户,而__repr__()用于显示给开发人员。
# class A(object):
# def __repr__(self):
# a = A()
# print(a) # 调用的是a的__str__方法
# 而如果你在python解释器里直接敲a后回车,调用的是a.__repr__()
def __str__(self):
return '(%s, %s)' % (self.left, self.right)
def __repr__(self):
return self.__str__()
if __name__ == "__main__":
# if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;
# 当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
A = []
A.append(Interval(1, 7))
A.append(Interval(1, 6))
A.append(Interval(5, 6))
A.append(Interval(3, 4))
print("Before sort:")
for i in A:
#print("({},{})".format(i.left, i.right))
print(i)
# 由于定义了__lt__,方法,此处可以直接调用sort方法进行升序排序
A.sort()
print("After sort:")
for i in A:
# print("({},{})".format(i.left, i.right))
print(i)
# 方法2 定义key
# key在sort()方法里面指的是比较的对象,若拥有多个比较的对象,写成Tuple
# 为了写起来简便用了lambda
data = [(3, 2), (3, 1), (2, 7), (1, 5), (2, 6), (1, 7)]
intervals = [Interval(left, right) for left, right in data]
print(sorted(intervals, key=lambda i: (i.left, i.right))) # 先按x从小到大排,再按y从小到大排
# 结果: [Interval(1, 5), Interval(1, 7), Interval(2, 6), Interval(2, 7), Interval(3, 1), Interval(3, 2)]
print(sorted(intervals, key=lambda i: (-i.left, i.right))) # 先按x从大到小排,再按y从小到大排
# 结果: [Interval(3, 1), Interval(3, 2), Interval(2, 6), Interval(2, 7), Interval(1, 5), Interval(1, 7)]
print(sorted(intervals, key=lambda i: (i.right, i.left))) # 先按y从小到大排,再按x从小到大排
# 结果: [Interval(3, 1), Interval(3, 2), Interval(1, 5), Interval(2, 6), Interval(1, 7), Interval(2, 7)]
print(sorted(intervals, key=lambda i: (-i.right, i.left))) # 先按y从大到小排,再按x从小到大排
# 结果: [Interval(1, 7), Interval(2, 7), Interval(2, 6), Interval(1, 5), Interval(3, 2), Interval(3, 1)]