![](/img/trans.png)
[英]How to sort a list in descending order for the first criteria and ascending order for the second criteria?
[英]How can i sort a list by the second item descending and first one ascending?
我有一個這樣的列表:
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), ]
您想根據兩個標准進行排序,其中一個標准充當另一個標准的決勝局。 由於 python 的sorted
和list.sort
保證是穩定的排序,因此一種解決方案是對列表進行兩次排序:首先按 tie-breaker 對其進行排序,然后按主要標准對其進行排序。 這是@Bharel 的答案。
另一種可能性是只排序一次,使用元組作為鍵。 Python 的sorted
和list.sort
都提供reverse= True or False
參數來指定按升序或降序排序; 但是在您的情況下,我們希望根據第一個標准按降序排序,並根據第二個標准按升序排序。 reverse
關鍵字沒有幫助,因為它是全有或全無:它不允許我們選擇要反轉的標准。
由於第一個標准是數字(整數),一個簡單的逆序排序技巧是用減號取反:
sortlist = sorted(list_results, key=lambda x:(-x[1], x[0]))
注意-x[1]
而不是x[1]
。
這里有兩個 arguments 支持按元組排序一次,而不是兩次:
(-x[1], x[0])
排序時,立即清楚-x[1]
是主要標准,而x[0]
只是一個平局。 相比之下,如果您排序兩次,閱讀您的代碼的人需要花一點時間來理解最后一個排序是最重要的,而前一個排序只是作為一個決勝局,依賴於sorted
是一種穩定的排序。n log(n)
字符串比較將在第一次排序中執行。如果您的列表很小,那么哪個版本更快可能並不重要(除非您反復對許多小列表進行排序......),所以這是一個偏好和可讀性的問題。
首先按第一項排序列表,然后按第二項排序:
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 個值相同,它們將保持原來的順序。
如果先按字母排序,再按優先級排序,則列表會先按字母排序,再按優先級重新排序,字母次之。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.