在 Python 數(shù)據(jù)處理中,列表排序是高頻操作,無論是整理數(shù)據(jù)、篩選結(jié)果還是展示信息,都需通過排序讓列表元素按預(yù)期順序排列。Python 提供了多種列表排序方法,其中sort方法與sorted函數(shù)最為常用,但兩者在使用場(chǎng)景與效果上存在關(guān)鍵差異。小編將梳理列表排序的核心方法,詳解sort與sorted的區(qū)別,助你高效完成排序需求。
一、Python 列表排序的 3 種核心方法
Python 列表排序可通過 “內(nèi)置方法”“內(nèi)置函數(shù)”“自定義邏輯” 實(shí)現(xiàn),覆蓋從基礎(chǔ)排序到復(fù)雜場(chǎng)景的需求,具體如下:
(一)list.sort():列表內(nèi)置排序方法
sort是列表專屬的內(nèi)置方法,直接對(duì)原列表進(jìn)行排序,無需創(chuàng)建新列表,語法為list.sort(key=None, reverse=False)。其中:
key:指定排序依據(jù)的函數(shù)(如按元素長(zhǎng)度、元素某屬性排序),默認(rèn)值為None(按元素本身排序);
reverse:布爾值,F(xiàn)alse表示升序(默認(rèn)),True表示降序。
示例:基礎(chǔ)升序與降序排序
TypeScript取消自動(dòng)換行復(fù)制
nums = [3, 1, 4, 2]
# 升序排序(默認(rèn))
nums.sort()
print(nums) # 輸出:[1, 2, 3, 4]
# 降序排序
nums.sort(reverse=True)
print(nums) # 輸出:[4, 3, 2, 1]
示例:按自定義規(guī)則排序(如字符串長(zhǎng)度)
TypeScript取消自動(dòng)換行復(fù)制
words = ["apple", "banana", "cherry", "date"]
# 按字符串長(zhǎng)度升序排序,key指定len函數(shù)為排序依據(jù)
words.sort(key=len)
print(words) # 輸出:["date", "apple", "cherry", "banana"]
(二)sorted():內(nèi)置全局排序函數(shù)
sorted是 Python 內(nèi)置的全局函數(shù),可對(duì)任意可迭代對(duì)象(如列表、元組、字典)排序,返回一個(gè)新的排序后列表,原對(duì)象保持不變,語法為sorted(iterable, key=None, reverse=False)。參數(shù)含義與sort一致,但需傳入待排序的可迭代對(duì)象作為第一個(gè)參數(shù)。
示例:對(duì)列表排序并保留原列表
TypeScript取消自動(dòng)換行復(fù)制
original = [5, 2, 7, 1]
# 排序后返回新列表,原列表不變
sorted_list = sorted(original)
print(sorted_list) # 輸出:[1, 2, 5, 7]
print(original) # 輸出:[5, 2, 7, 1](原列表未變)
示例:對(duì)元組排序(返回列表)
TypeScript取消自動(dòng)換行復(fù)制
tuples = [(2, "b"), (1, "a"), (3, "c")]
# 按元組第一個(gè)元素升序排序
sorted_tuples = sorted(tuples, key=lambda x: x[0])
print(sorted_tuples) # 輸出:[(1, "a"), (2, "b"), (3, "c")]
(三)自定義排序:借助functools.cmp_to_key
對(duì)于復(fù)雜排序邏輯(如多條件排序、自定義比較規(guī)則),可使用functools模塊的cmp_to_key函數(shù),將自定義比較函數(shù)轉(zhuǎn)換為key參數(shù)可接受的格式。這種方法適用于無法通過簡(jiǎn)單key函數(shù)實(shí)現(xiàn)的場(chǎng)景。
示例:多條件排序(先按數(shù)字升序,再按字母降序)
TypeScript取消自動(dòng)換行復(fù)制
from functools import cmp_to_key
data = [(2, "b"), (1, "c"), (2, "a")]
# 自定義比較函數(shù):x、y為待比較元素
def compare(x, y):
# 先按第一個(gè)元素升序:x[0] < y[0]則x在前,返回-1
if x[0] != y[0]:
return x[0] - y[0]
# 第一個(gè)元素相等時(shí),按第二個(gè)元素降序:x[1] > y[1]則x在前,返回-1
else:
return -1 if x[1] > y[1] else 1
# 用cmp_to_key轉(zhuǎn)換比較函數(shù),傳入sorted
sorted_data = sorted(data, key=cmp_to_key(compare))
print(sorted_data) # 輸出:[(1, "c"), (2, "b"), (2, "a")]
二、sort與sorted的 4 大核心區(qū)別
sort與sorted雖都用于排序,但在使用場(chǎng)景、對(duì)原對(duì)象的影響等方面差異顯著,需根據(jù)需求選擇,具體區(qū)別如下:
(一)作用對(duì)象不同
sort:僅為列表(list)的內(nèi)置方法,只能對(duì)列表排序,無法用于元組、字典等其他可迭代對(duì)象;
sorted:全局函數(shù),可對(duì)任意可迭代對(duì)象排序(如列表、元組、字符串、字典的鍵 / 值),適用范圍更廣。
示例:sorted對(duì)元組排序(sort無法實(shí)現(xiàn))
TypeScript取消自動(dòng)換行復(fù)制
t = (3, 1, 2)
# 正確:sorted對(duì)元組排序,返回列表
print(sorted(t)) # 輸出:[1, 2, 3]
# 錯(cuò)誤:元組無sort方法,會(huì)報(bào)錯(cuò)
t.sort() # AttributeError: 'tuple' object has no attribute 'sort'
(二)返回值不同
sort:無返回值(返回None),排序操作直接作用于原列表;
sorted:返回一個(gè)新的排序后列表,原可迭代對(duì)象保持不變。
示例:返回值差異對(duì)比
TypeScript取消自動(dòng)換行復(fù)制
nums = [3, 1, 2]
# sort返回None,原列表被修改
result_sort = nums.sort()
print(result_sort) # 輸出:None
print(nums) # 輸出:[1, 2, 3]
nums2 = [3, 1, 2]
# sorted返回新列表,原列表不變
result_sorted = sorted(nums2)
print(result_sorted) # 輸出:[1, 2, 3]
print(nums2) # 輸出:[3, 1, 2]
(三)對(duì)原對(duì)象的影響不同
sort:原地排序(in-place sorting),直接修改原列表的元素順序,排序后原列表無法恢復(fù)到排序前的狀態(tài);
sorted:非原地排序,不修改原可迭代對(duì)象,僅通過創(chuàng)建新列表返回排序結(jié)果,原對(duì)象始終保持初始狀態(tài)。
適用場(chǎng)景差異:若需保留原列表,用sorted;若無需保留原列表,用sort(更節(jié)省內(nèi)存,無需創(chuàng)建新列表)。
(四)使用靈活性不同
sort:僅能作為列表方法調(diào)用,語法固定為list.sort(...);
sorted:可嵌套使用,或作為其他操作的中間步驟(如排序后直接切片、遍歷),靈活性更高。
示例:sorted嵌套使用(排序后取前 2 個(gè)元素)
TypeScript取消自動(dòng)換行復(fù)制
data = [5, 3, 8, 1]
# sorted排序后直接切片,一步完成
top2 = sorted(data)[:2]
print(top2) # 輸出:[1, 3]
# 若用sort,需多步操作
data.sort()
top2_sort = data[:2]
print(top2_sort) # 輸出:[1, 3]
Python 列表排序主要有 3 種方法:list.sort()(列表專屬、原地排序)、sorted()(全局函數(shù)、返回新列表)、cmp_to_key(復(fù)雜自定義排序)。其中sort與sorted是日常開發(fā)的核心工具,兩者的關(guān)鍵區(qū)別在于:sort作用于列表、無返回值、修改原列表;sorted適用于所有可迭代對(duì)象、返回新列表、不修改原對(duì)象。