大家都知道,在Python中,可以使用.sort方法或者对各种数据进行排序,例如:a=[2,3,1,9,3,7,4]a.sort()b=[2,3,1,9,3,7,4]c=已排序(b,reverse=True)运行效果如下图所示:我们也知道Python中的元组是可以进行大小比较的。它的比较方式是先比较第一个元素,如果第一个元素相等,再比较第二个元素。所以包含元组的列表也可以这样排序,例如:d=[(6,5),(1,3),(4,7),(6,4),(1,8),(7,9)]d.sort()但是现在问题来了,如果要对这个列表进行排序,但是需要对元组中的第一个元素进行升序排序,第二个元素进行降序排序,怎么办呢?之前有个很简单的算法题:输入一串字符串,输出出现频率最高的3个字母:s='asgaurghajsfa;oeiwfasdfasdgrwerw'count={}forletterins:count.setdefault(letter,0)count[letter]+=1result=sorted(count.items(),key=lambdax:x[1],reverse=True)print('三个最常出现的字母是:',result[:3])运行效果如下图所示:如果你做过这道算法题,那你一定知道怎么做。只需设置关键参数即可。在第二个元素前加一个负号:d=[(6,5),(1,3),(4,7),(6,4),(1,8),(7,9)]e=sorted(d,key=lambdax:(x[0],-x[1]))运行效果如下图所示:现在问题来了,如果sorted中元组的第二项列表不是数字而不是字符串呢?字符串前不能加负号。例如,要对以下列表进行排序,元组的第一个元素按升序排列,第二个元素按降序排列:[(6,'apple'),(1,'google'),(4,'future'),(6,'zero'),(1,'stand'),(7,'t')]可能有同学认为可以把字符转成Ascii码,加个减号。这种方法对单个字符确实有效,但是当字符串有多个字符时,这样做就变得很麻烦了。为了解决这个问题,我们需要回忆一下为什么在Python中,有些对象可以进行大小比较,而有些则不能呢?为什么字符串可以比较大小,数字可以比较大小,但是我自定义一个类,然后生成一个对象,就不能比较大小?Python中可以比较大小的对象是因为它们的类中有一个特殊的魔术方法:__eq__用于判断是否相等,__lt__用于判断是否小于,__gt__用于判断是不是大于...,比如:这样,如果要倒序,只需要将__lt__中的逻辑倒过来即可:我们再写一个排序函数,位置用这个自定义的需要反转的Classpackage:classReversor:def__init__(self,value):self.value=valuedef__eq__(self,other):returnself.value==other.valuedef__lt__(self,other):returnother.value
