列表排序:Python列表.sort()與sorted()的區別

當我們需要對一個列表進行排序時,Python提供了兩個常用工具:list.sort()sorted()。雖然它們都能實現排序,但在修改原列表返回值上有本質區別,初學者很容易混淆。今天我們就用簡單的例子和清晰的對比,搞懂它們的用法!

1. list.sort():直接修改原列表的“原地排序”

list.sort() 是列表自帶的方法,使用時直接在列表後調用,例如 my_list.sort()。它的核心特點是:會直接修改原來的列表,並且沒有返回值(返回 None)。

舉個例子:

# 定義一個需要排序的列表
my_list = [3, 1, 4, 2]

# 調用sort()方法
my_list.sort()

# 打印排序後的列表,原列表已被修改
print(my_list)  # 輸出:[1, 2, 3, 4]

此時,原列表 my_list 已經變成了排序後的樣子。如果嘗試獲取返回值,會發現它是 None

result = my_list.sort()
print(result)  # 輸出:None(說明sort()沒有返回新列表)

2. sorted():創建新列表的“非原地排序”

sorted() 是Python的內置函數,使用時直接傳入列表,例如 sorted(my_list)。它的核心特點是:不會修改原列表,而是創建一個新的排序後的列表並返回

同樣用上面的例子:

# 定義一個需要排序的列表
my_list = [3, 1, 4, 2]

# 調用sorted()函數,得到新的排序列表
sorted_list = sorted(my_list)

# 原列表保持不變
print(my_list)  # 輸出:[3, 1, 4, 2]

# 新列表是排序後的結果
print(sorted_list)  # 輸出:[1, 2, 3, 4]

此時,原列表 my_list 完全沒變,而 sorted_list 是排序後的新列表。

核心區別:原地修改 vs 保留原列表

對比項 list.sort()(列表方法) sorted()(內置函數)
是否修改原列表 是(直接改變原列表) 否(不修改原列表,返回新列表)
返回值 返回 None 返回排序後的新列表
適用場景 原列表不需要保留時 原列表需要保留,或需對其他可迭代對象排序時

進階參數:reverse 和 key

sort()sorted() 都支持兩個參數,控制排序細節:

(1)reverse:控制升序/降序

  • 默認 reverse=False(升序,從小到大);設爲 reverse=True 則降序(從大到小)。

示例:

my_list = [3, 1, 4, 2]
my_list.sort(reverse=True)  # 降序排序
print(my_list)  # 輸出:[4, 3, 2, 1]

# sorted() 同樣支持 reverse
sorted_list = sorted(my_list, reverse=True)
print(sorted_list)  # 輸出:[4, 3, 2, 1]

(2)key:自定義排序規則

如果需要按特殊規則排序(如按字符串長度、元組的某個元素),可以用 key 參數。

示例(按字符串長度排序):

words = ["apple", "cat", "banana"]
sorted_words = sorted(words, key=lambda x: len(x))  # 按字符串長度升序
print(sorted_words)  # 輸出:['cat', 'apple', 'banana'](長度3→5→6)

這裏 lambda x: len(x) 是一個“匿名函數”,用於提取每個字符串的長度作爲排序依據。

如何選擇?

  • list.sort():如果你確定不需要原列表了,想直接修改它(節省內存,無需額外空間)。
  • sorted():如果你需要保留原列表,或者想對其他可迭代對象(如元組、字符串)排序。

常見易錯點

  1. 不要以爲 sorted() 會修改原列表:原列表始終保持原樣,sorted() 只返回新列表。
  2. 別試圖用 sort() 獲取返回值:它返回 None,無法賦值給變量。
  3. 元組無法用 sort():元組是不可變的,沒有 sort() 方法,只能用 sorted() 轉換爲列表排序。

總結

  • list.sort():原地修改原列表,返回 None,適合不需要保留原列表的場景。
  • sorted():不修改原列表,返回新列表,適合需要保留原列表或對其他對象排序的場景。

根據是否需要保留原列表,選擇合適的工具即可!

小夜