小白一名,最近在做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開始。