在 Python 数据处理中,列表排序是高频操作,无论是整理数据、筛选结果还是展示信息,都需通过排序让列表元素按预期顺序排列。Python 提供了多种列表排序方法,其中sort方法与sorted函数最为常用,但两者在使用场景与效果上存在关键差异。小编将梳理列表排序的核心方法,详解sort与sorted的区别,助你高效完成排序需求。
一、Python 列表排序的 3 种核心方法
Python 列表排序可通过 “内置方法”“内置函数”“自定义逻辑” 实现,覆盖从基础排序到复杂场景的需求,具体如下:
(一)list.sort():列表内置排序方法
sort是列表专属的内置方法,直接对原列表进行排序,无需创建新列表,语法为list.sort(key=None, reverse=False)。其中:
key:指定排序依据的函数(如按元素长度、元素某属性排序),默认值为None(按元素本身排序);
reverse:布尔值,False表示升序(默认),True表示降序。
示例:基础升序与降序排序
TypeScript取消自动换行复制
nums = [3, 1, 4, 2]
# 升序排序(默认)
nums.sort()
print(nums) # 输出:[1, 2, 3, 4]
# 降序排序
nums.sort(reverse=True)
print(nums) # 输出:[4, 3, 2, 1]
示例:按自定义规则排序(如字符串长度)
TypeScript取消自动换行复制
words = ["apple", "banana", "cherry", "date"]
# 按字符串长度升序排序,key指定len函数为排序依据
words.sort(key=len)
print(words) # 输出:["date", "apple", "cherry", "banana"]
(二)sorted():内置全局排序函数
sorted是 Python 内置的全局函数,可对任意可迭代对象(如列表、元组、字典)排序,返回一个新的排序后列表,原对象保持不变,语法为sorted(iterable, key=None, reverse=False)。参数含义与sort一致,但需传入待排序的可迭代对象作为第一个参数。
示例:对列表排序并保留原列表
TypeScript取消自动换行复制
original = [5, 2, 7, 1]
# 排序后返回新列表,原列表不变
sorted_list = sorted(original)
print(sorted_list) # 输出:[1, 2, 5, 7]
print(original) # 输出:[5, 2, 7, 1](原列表未变)
示例:对元组排序(返回列表)
TypeScript取消自动换行复制
tuples = [(2, "b"), (1, "a"), (3, "c")]
# 按元组第一个元素升序排序
sorted_tuples = sorted(tuples, key=lambda x: x[0])
print(sorted_tuples) # 输出:[(1, "a"), (2, "b"), (3, "c")]
(三)自定义排序:借助functools.cmp_to_key
对于复杂排序逻辑(如多条件排序、自定义比较规则),可使用functools模块的cmp_to_key函数,将自定义比较函数转换为key参数可接受的格式。这种方法适用于无法通过简单key函数实现的场景。
示例:多条件排序(先按数字升序,再按字母降序)
TypeScript取消自动换行复制
from functools import cmp_to_key
data = [(2, "b"), (1, "c"), (2, "a")]
# 自定义比较函数:x、y为待比较元素
def compare(x, y):
# 先按第一个元素升序:x[0] < y[0]则x在前,返回-1
if x[0] != y[0]:
return x[0] - y[0]
# 第一个元素相等时,按第二个元素降序:x[1] > y[1]则x在前,返回-1
else:
return -1 if x[1] > y[1] else 1
# 用cmp_to_key转换比较函数,传入sorted
sorted_data = sorted(data, key=cmp_to_key(compare))
print(sorted_data) # 输出:[(1, "c"), (2, "b"), (2, "a")]
二、sort与sorted的 4 大核心区别
sort与sorted虽都用于排序,但在使用场景、对原对象的影响等方面差异显著,需根据需求选择,具体区别如下:
(一)作用对象不同
sort:仅为列表(list)的内置方法,只能对列表排序,无法用于元组、字典等其他可迭代对象;
sorted:全局函数,可对任意可迭代对象排序(如列表、元组、字符串、字典的键 / 值),适用范围更广。
示例:sorted对元组排序(sort无法实现)
TypeScript取消自动换行复制
t = (3, 1, 2)
# 正确:sorted对元组排序,返回列表
print(sorted(t)) # 输出:[1, 2, 3]
# 错误:元组无sort方法,会报错
t.sort() # AttributeError: 'tuple' object has no attribute 'sort'
(二)返回值不同
sort:无返回值(返回None),排序操作直接作用于原列表;
sorted:返回一个新的排序后列表,原可迭代对象保持不变。
示例:返回值差异对比
TypeScript取消自动换行复制
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]
(三)对原对象的影响不同
sort:原地排序(in-place sorting),直接修改原列表的元素顺序,排序后原列表无法恢复到排序前的状态;
sorted:非原地排序,不修改原可迭代对象,仅通过创建新列表返回排序结果,原对象始终保持初始状态。
适用场景差异:若需保留原列表,用sorted;若无需保留原列表,用sort(更节省内存,无需创建新列表)。
(四)使用灵活性不同
sort:仅能作为列表方法调用,语法固定为list.sort(...);
sorted:可嵌套使用,或作为其他操作的中间步骤(如排序后直接切片、遍历),灵活性更高。
示例:sorted嵌套使用(排序后取前 2 个元素)
TypeScript取消自动换行复制
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()(全局函数、返回新列表)、cmp_to_key(复杂自定义排序)。其中sort与sorted是日常开发的核心工具,两者的关键区别在于:sort作用于列表、无返回值、修改原列表;sorted适用于所有可迭代对象、返回新列表、不修改原对象。