小白一名,最近在做ccfcsp的题目,做到201503-02数字排序,个人认为这个题目就是属于多条件排序,当然题目里面说的也很清楚,先按照次数进行降序,次数相同的话,就按照升序进行排。
在csdn里查找几个关于Python多条件排序,说的好像都没毛病,但是配的代码自己运行,就会出现问题,得不出博主的结果,也不敢问,自己觉得写的代码好像错了哈。所以自己在他们的基础上,归纳下哈。
主条件升(降)序,同等情况下次条件降(升)。这里介绍2种条件,2种以上也是一样的。
1、纯数值
先举例
查到的说sorted函数属于稳定排序,原型是
常用到的参数是iterable,key,reverse,具体是啥意思请自己查哈
这里的key可以是一个参数,也可以是一个自定义的函数,上面那行代码的意思就是对a这个列表,先按照元组的第二个元素进行降序排序,遇到同等情况,如这里的(3,4)(2,4)就对元组中第一个元素进行升序排序。
其结果是
主次条件的顺序等于key=lambda x:(-x[1],x[0])这里面的括号中顺序,也就是说如果你想要先按元组中第一个元素排升序,同等条件下,按第二个排降序,写法就是sorted(a,key=lambda x:x[0],-x[1])),这里加负号的原因是,该方法默认reverse=False,也就是升序,要是写降序,就得加负号。前提是排序的都是数值哈。
也可以分开来写,分开写,先排次条件,再排主条件。
2、字符
借鉴一个他人的数据,这里的排序要求是按照升序进行排序,条件优先:P>GD>GS>GA
teamitems = [{'team':'France' , 'P':1 , 'GD':-3 , 'GS':1 , 'GA':4}, {'team':'Uruguay' , 'P':7 , 'GD':4 , 'GS':4 , 'GA':0}, {'team':'SouthAfrica' , 'P':4 , 'GD':-2 , 'GS':3 , 'GA':5}, {'team':'Mexico' , 'P':4 , 'GD':1 , 'GS':3 , 'GA':2}] print(sorted(teamitems ,key = lambda x:(x['P'],x['GD'],x['GS'],x['GA']),reverse=True) )
如果是要某一部分条件升,一部分降的话,就只能分开写,而且是有先后顺序地。优先级高的条件要写在最后。优先级低的反而写在前面。
这里key除了写简单的lambda,还可以写函数。
https://www.cnblogs.com/yeyong/p/6074825.html这篇博主写的list多级排序,
举例的第二个我运行是错误,
思路没问题,但是举的第二个例子第一行代码我运行出错,这里的items应该是
items = [x.split(',') for x in list(filter(None, data.split('\n')[2:]))]
fliter是过滤器,返回的迭代对象,另外博主注释的是忽略首行,应该还有第一行,所以从2开始。