Python的自列表的定义排序
Python的自列表的定义排序
因是c++Acmer,故经常用到自定义排序
第一种方法:对小于号进行重载
因为所有比较都可通过小于号的结果进行推导
class Dch:
def __init__(self,a,b):
self.first=a
self.second=b
def __str__(self):
return "first={},second={}".format(self.first,self.second)
def __lt__(self, other):
if (self.first == other.first):
return int(self.second < other.second)
return int(self.first < other.first)
# isinstance(100,int)
aa=Dch(1,2)
bb=Dch(100,1)
cc=Dch(50,50)
dd=Dch(30,-1)
ee=Dch(1,20)
Mylist=[aa,bb,cc,dd,ee]
Mylist=sorted(Mylist)#sorted函数返回对list排序的结果,默认是稳定的归并排序
for i in range(len(Mylist)):
print(Mylist[i])
列表也有内置函数sort,这是官方的解释
sort
(***, key=None, reverse=False)此方法会对列表进行原地排序,只使用
<
来进行各项间比较。 异常不会被屏蔽 —— 如果有任何比较操作失败,整个排序操作将失败(而列表可能会处于被部分修改的状态)。
sort()
接受两个仅限以关键字形式传入的参数 (仅限关键字参数):…
first=1,second=2
first=1,second=20
first=30,second=-1
first=50,second=50
first=100,second=1
第二种用sort的key参数和lambda表达式
可以参考python的官网文档:https://docs.python.org/zh-cn/3/library/stdtypes.html#list.sort
class pair:
def __init__(self,x=0,y=0):
self.x=x
self.y=y
def __lt__(self, other):
if self.x==other.x:
return self.y<other.y
return self.x-self.y
def __str__(self):
return "%d,%d"% (self.x,self.y)
me=[]
me.append(pair(3,4))
me.append(pair(1,3))
me.append(pair(-1,-1))
me.sort(key=lambda x:(x.y))
for i in me:
print(i)
#输出:
#-1,-1
#1,3
#3,4
深入使用sort的key参数
如果我们用lambda表达式进行指定key关键词排序时遇见c++ 这样的pair要求的排序 (第一个关键词从小到大排序,如果相同则按第二个关键词从小到大排序)该怎么做呢?
lambda表达式的结果可返回一个元组,按照对元素为元组的数组排序则默认字典序排序。
class pair:
def __init__(self,x=0,y=0):
self.x=x
self.y=y
def __str__(self):
return "{} {}".format(self.x,self.y)
if __name__ == '__main__':
mmp=[]
mmp.append(pair(1,2))
mmp.append(pair(0, 2))
mmp.append(pair(4, 5))
mmp.append(pair(7, 8))
mmp.append(pair(4, 3))
mmp.sort(key=lambda me:(me.x,me.y))#这样就会按照元组的字典序进行排序
for i in mmp:
print(i)
''' 输出 0 2 1 2 4 3 4 5 7 8 '''
#