Python列表排序方法完整指南|從 sort() 和 sorted() 的差異到自定義排序全面解析

1. 前言

Python 是一種簡單且直觀的程式語言,廣泛用於各種開發領域。其中「列表排序」是基本且經常使用的操作之一。本文將詳細介紹在 Python 中進行列表排序的方法,並說明如何進行自訂排序以及需要注意的重點。

閱讀本文後,即使是初學者也能掌握有效率地排序列表的方法,並能在實際開發中加以應用。

2. 列表的排序方法

在 Python 中主要有兩種排序方式。我們來看看它們的特點與使用方法。

2.1 使用 sort() 方法進行排序

sort() 是列表物件內建的方法,會直接修改原始列表的順序。預設情況下為升冪排序(由小到大),如果指定 reverse=True 則會變成降冪(由大到小)。

基本用法

numbers = [3, 1, 4, 1, 5]
numbers.sort()
print(numbers)  # 輸出: [1, 1, 3, 4, 5]

降冪排序的寫法

numbers = [3, 1, 4, 1, 5]
numbers.sort(reverse=True)
print(numbers)  # 輸出: [5, 4, 3, 1, 1]

2.2 使用 sorted() 函數進行排序

sorted() 函數會不改變原始列表,而是返回一個新的已排序列表。預設為升冪排序,也可以透過 reverse=True 改為降冪。

基本用法

numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 輸出: [1, 1, 3, 4, 5]
print(numbers)  # 輸出: [3, 1, 4, 1, 5] 原始列表未被改變

降冪排序的寫法

numbers = [3, 1, 4, 1, 5]
sorted_numbers = sorted(numbers, reverse=True)
print(sorted_numbers)  # 輸出: [5, 4, 3, 1, 1]

 


3. 自定義排序(使用 key 參數)

在實際開發中,我們常常需要根據特定條件進行排序。這時可以使用 key 參數來指定排序的依據。例如,可以根據字串長度、物件屬性等進行排序。

根據字串長度排序

words = ["banana", "apple", "cherry", "date"]
words.sort(key=len)
print(words)  # 輸出: ['date', 'apple', 'banana', 'cherry']

使用 lambda 表達式進行排序

也可以使用 lambda 表達式進行更靈活的排序邏輯。

numbers = [3, 1, 4, 1, 5, 9]
sorted_numbers = sorted(numbers, key=lambda x: -x)
print(sorted_numbers)  # 輸出: [9, 5, 4, 3, 1, 1]

對複雜資料結構排序(例如字典列表)

data = [
  {"name": "Alice", "age": 30},
  {"name": "Bob", "age": 25},
  {"name": "Charlie", "age": 35}
]

# 根據 age 進行排序
sorted_data = sorted(data, key=lambda x: x["age"])
print(sorted_data)
# 輸出:
# [{'name': 'Bob', 'age': 25},
#  {'name': 'Alice', 'age': 30},
#  {'name': 'Charlie', 'age': 35}]

4. sort() 和 sorted() 的差異

sort()sorted() 都可以用來排序,但有以下幾點差異:

  • sort() 是列表的方法:會直接修改原始列表。
  • sorted() 是內建函式:不會改變原始資料,會返回一個新的列表。

根據使用場景的不同,可以選擇合適的方法。


年収訴求

5. TimSort 演算法的運作原理

Python 中的排序實作採用了名為 TimSort 的演算法。這是一種結合了 合併排序(Merge Sort)插入排序(Insertion Sort) 的混合排序演算法。

TimSort 的優點是能夠根據資料的實際特性,自動選擇最有效率的排序方式。當資料部分已經排序時,它能有效提升整體的排序效能。

這種演算法的核心理念如下:

  • 將列表分割為小區段(稱為 run)。
  • 針對每個 run 使用插入排序。
  • 最後將已排序的區段進行合併。

TimSort 最早由 Java 的工程師 Tim Peters 提出,並成為 Python 的預設排序演算法(從 Python 2.3 開始)。


6. 實用技巧與注意事項

以下是使用排序函式時實務上需要注意的一些要點:

6.1 不要混用不同資料型態

若列表中包含不同型別的元素(例如整數與字串),排序時可能會拋出錯誤。

mixed = [1, "apple", 3]
# 這樣會發生 TypeError,因為 int 與 str 不能比較

6.2 利用 key 與 lambda 實現進階排序

透過 key 參數與 lambda 表達式,可以根據多種條件進行排序,例如多層級排序(先依 A 欄位,再依 B 欄位)。

data = [
  {"name": "Alice", "score": 80},
  {"name": "Bob", "score": 90},
  {"name": "Charlie", "score": 80}
]

# 先依照 score 降冪,再依照 name 升冪
sorted_data = sorted(data, key=lambda x: (-x["score"], x["name"]))
print(sorted_data)

7. 總結

本文介紹了 Python 中的列表排序方法,包含:

  • sort():會修改原始列表
  • sorted():不會修改原始資料,會返回新的排序結果
  • 使用 keylambda 實現自定義排序
  • 背後的 TimSort 演算法機制

根據實際情況靈活使用這些排序技巧,能大大提升開發效率與程式的可讀性。


Python 的排序功能強大又直覺,熟悉這些基本與進階技巧後,你將能應對各種實務情境中的資料處理需求。