當我們需要對一個列表進行排序時,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():如果你需要保留原列表,或者想對其他可迭代對象(如元組、字符串)排序。
常見易錯點¶
- 不要以爲
sorted()會修改原列表:原列表始終保持原樣,sorted()只返回新列表。 - 別試圖用
sort()獲取返回值:它返回None,無法賦值給變量。 - 元組無法用
sort():元組是不可變的,沒有sort()方法,只能用sorted()轉換爲列表排序。
總結¶
list.sort():原地修改原列表,返回None,適合不需要保留原列表的場景。sorted():不修改原列表,返回新列表,適合需要保留原列表或對其他對象排序的場景。
根據是否需要保留原列表,選擇合適的工具即可!