当我们需要对一个列表进行排序时,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():不修改原列表,返回新列表,适合需要保留原列表或对其他对象排序的场景。
根据是否需要保留原列表,选择合适的工具即可!