HOWTO · Python

在 Python 中對集合進行排序

本教程演示瞭如何使用 Python 對一組值進行排序

本頁內容

Python 的集合會儲存不重複的值,但不會依排序順序保存它們。若要取得有序的值,請將集合傳入 sorted():它會回傳新的串列,且不會更動原集合。若你已有串列,並想直接重新排列該串列,請使用 list.sort();集合本身沒有 sort() 方法。

在 Python 中使用 sorted() 函式排序集合

sorted() 接受可迭代物件,並回傳串列。若其中的值可以彼此比較,預設會依升冪排序。輸入集合仍可使用且不會改變,因此之後還能再次使用。集合列印或迭代時呈現的順序,不代表已排序;只要順序很重要,就應明確排序。

對小型整數集合使用 sorted(),會得到依升冪排列的新串列。執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

values = {5, 3, 1, 4, 2}
ascending = sorted(values)
descending = sorted(values, reverse=True)
words = {"pear", "fig", "watermelon"}
by_length = sorted(words, key=len)
print(ascending)
print(descending)
print(by_length)
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
['fig', 'pear', 'watermelon']

reverse 參數設為 True 時,會反轉比較順序。key 參數接受一個函式,為每個項目產生比較值;此處使用 len,依單字長度排列不同長度的單字。若鍵值相同,項目的相對順序會依照輸入可迭代物件的迭代順序,而集合的迭代順序並無保證。若相同鍵值時的順序也很重要,請在鍵中加入確定性的次要排序條件,例如以單字長度和單字組成的 tuple。

值必須能以預設比較方式彼此排序,或由 key 函式回傳彼此可比較的值。例如,集合可以同時包含整數和字串,但 Python 3 不支援直接排序這些混合型別的值。若符合任務需求,可選擇一個能將它們轉換為一致且可比較形式的鍵。對自訂物件,可以使用鍵擷取想要比較的屬性,前提是該屬性的值能夠排序。

在 Python 中使用 sort() 方法排序集合

list.sort() 是串列的方法,不是集合的方法。若要用它排序來自集合的值,請先使用 list(values) 將集合轉成串列,再對該串列呼叫 sort()。此方法會直接修改串列並回傳 None;不要將它的回傳值指定回串列變數。排序轉換後的串列不會影響原集合。

list.sort() 的 key 和 reverse 參數用法與 sorted() 相同。例如,items.sort(key=len, reverse=True) 會將字串串列由長到短排序。若你需要更新已持有的串列,串列方法就很實用。若只需要有序結果,並希望保留輸入可迭代物件不變,通常使用 sorted() 更簡單。

使用 set(ordered) 將結果轉回集合,可以保留不重複的值,但不會保留排序順序。集合沒有順序保證,因此轉換後不要依賴其顯示或迭代順序。若後續操作依賴次序,例如索引、以一致順序顯示值或依序處理,請保留已排序的串列。

結論

使用 sorted(my_set) 可取得新的升冪串列;加入 reverse=True 可改為降冪排序,使用 key=... 則可自訂排序條件。若要直接排序串列,請先使用 list(my_set),再呼叫 list.sort()。列印集合或將已排序的串列轉回集合,都不會保留排序順序;只要順序很重要,就使用串列。