簡體   English   中英

如何按第二項降序和第一項升序對列表進行排序?

[英]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 的sortedlist.sort保證是穩定的排序,因此一種解決方案是對列表進行兩次排序:首先按 tie-breaker 對其進行排序,然后按主要標准對其進行排序。 這是@Bharel 的答案。

另一種可能性是只排序一次,使用元組作為鍵。 Python 的sortedlist.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM