列表排序: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():不修改原列表,返回新列表,适合需要保留原列表或对其他对象排序的场景。

根据是否需要保留原列表,选择合适的工具即可!

小夜