我有一個這樣的清單:
list_results=[('Horror', 2), ('Romance', 2), ('Comedy', 2), ('History', 2), ('Adventure', 1), ('Action', 3)]
我希望按降序對數字進行排序,如果數字相同,則根據名稱按升序排序。
我嘗試了以下代碼:
sortlist=sorted(list_results,key=lambda x:(x[1],x[0]))
和相反,但我想不出這樣做。
我正在尋找的答案是:
[('Action', 3), ('Comedy', 2) ,('History', 2),('Horror', 2), ('Romance', 2), ('Adventure', 1), ]
uj5u.com熱心網友回復:
首先按第一項對串列進行排序,然后按第二項排序:
list_results = sorted(list_results, key=lambda x:x[0])
list_results = sorted(list_results, key=lambda x:x[1], reverse=True)
或者更好的是不復制:
import operator
list_results.sort(key=operator.itemgetter(0))
list_results.sort(key=operator.itemgetter(1), reverse=True)
Python 的排序演算法是Timsort。這是一個穩定的演算法,這意味著如果 2 個值相同,它們將保持原來的順序。
如果先按字母排序,然后按優先級排序,則串列將按字母排序,然后按優先級重新排序,字母次之。
uj5u.com熱心網友回復:
您想根據兩個標準進行排序,其中一個標準充當另一個標準的決勝局。由于 pythonsorted和list.sort保證是穩定的排序,一個解決方案是對串列進行兩次排序:首先按決勝局對其進行排序,然后按主要標準對其進行排序。這是@Bharel 的回答。
另一種可能性是只排序一次,使用元組作為鍵。Python's sortedandlist.sort兩者都提供了一個reverse= True or False引數來指定按遞增或遞減順序排序;但在您的情況下,我們希望相對于第一個標準按降序排序,相對于第二個標準按升序排序。該reverse關鍵字是沒有幫助的,因為它是全有或全無的:它不會讓我們選擇反相哪個標準。
由于第一個標準是數字(整數),逆序排序的一個簡單技巧是用減號否定它:
sortlist = sorted(list_results, key=lambda x:(-x[1], x[0]))
請注意,-x[1]而不僅僅是x[1]。
以下是支持按元組排序一次而不是兩次的兩個論據:
- 當根據 排序時
(-x[1], x[0]),很明顯這-x[1]是主要標準,x[0]只是一個決勝局。相比之下,如果你排序兩次,閱讀你代碼的人需要花一點時間才能理解最后一個排序是最重要的,而前一個排序只是作為一個依賴于sorted穩定排序的決勝局。 - 如果串列很長,用元組鍵排序一次可能比用簡單鍵排序兩次快。尤其如此,因為第二個鍵是一個字串;比較字串比比較整數慢。如果使用元組,則字串將只比較第一個鍵上不等式的兩個專案;但是如果你排序兩次,大約
n log(n)字串比較將在第一次排序中執行。
如果您的串列很小,那么哪個版本更快可能并不重要(除非您反復對大量小串列進行排序......),所以這是一個偏好和可讀性的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379976.html
上一篇:當index.return=TRUE時,R中的排序函式
下一篇:Mysql按陣列中的值排序
