目录
一、核心区别:原地排序 vs 新建排序
1. list.sort()
:原地操作
-
适用对象:仅限列表
-
行为:直接修改原列表,返回
None
numbers = [3, 1, 4, 2]
numbers.sort()
print(numbers) # 输出:[1, 2, 3, 4]
2. sorted()
:生成新对象
-
适用对象:任意可迭代对象(列表、元组、字符串等)
-
行为:返回新的排序列表,原对象不变
-
特点:保留原始数据,灵活通用
original = (5, 2, 8, 1)
new_list = sorted(original)
print(original) # 输出:(5, 2, 8, 1)
print(new_list) # 输出:[1, 2, 5, 8]
二、参数详解:掌控排序逻辑
1.sort函数语法:
list.sort(key=None, reverse=False)
key
:这是一个可选参数,它是一个函数(支持lambda表达式和自定义函数),该函数会作用于列表中的每个元素,根据函数的返回值来进行排序。默认值为None
,表示直接比较元素本身。reverse
:这也是一个可选参数,是一个布尔值。如果设置为True
,列表将按降序排列;如果为False
(默认值),则按升序排列。
words = ["apple", "cat", "banana"]
words.sort(reverse=True)
print(words) # 输出:['cat', 'banana', 'apple']
2.sorted函数语法:
sorted(iterable, key=None, reverse=False)
iterable
:必需参数,指要排序的可迭代对象。key
和reverse
参数的作用与sort()
方法中的相同。
常见应用场景:
① 按字符串长度排序
fruits = ["kiwi", "banana", "cherry"]
sorted_fruits = sorted(fruits, key=lambda x: len(x))
# 结果:['kiwi', 'cherry', 'banana']
② 按字典值排序
users = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 20}
]
sorted_users = sorted(users, key=lambda u: u["age"])
# 结果:Bob在前,Alice在后
③ 多级排序(先按年龄,后按姓名)
from operator import itemgetter
people = [
("Charlie", 25),
("Alice", 25),
("Bob", 20)
]
sorted_people = sorted(people, key=itemgetter(1, 0))
# 结果:[('Bob',20), ('Alice',25), ('Charlie',25)]
三、高级技巧与最佳实践
1. 混合类型排序注意事项
Python3禁止直接比较不同类型数据:
mixed = ["a", 1, 2.5]
sorted(mixed) # 触发TypeError
2. 稳定性保证
Python的排序是稳定的——当元素优先级相同时,原始顺序会被保留。这在多条件排序中非常有用:
data = [(2, "apple"), (1, "banana"), (2, "cherry")]
sorted_data = sorted(data, key=lambda x: x[0])
# 结果:[(1, 'banana'), (2, 'apple'), (2, 'cherry')]
3. 性能优化
-
对于包含10万+元素的大列表,
sort()
的内存效率更高 -
对复杂对象排序时,优先使用
operator
模块的itemgetter
/attrgetter
,它们比lambda更快
四、如何选择?
-
需要保留原对象 → 用
sorted()
-
操作对象不是列表 → 用
sorted()
-
处理大型数据集 → 用
sort()
-
需要链式调用 → 用
sorted()
五、常见误区与排雷
错误1:误用返回值
# 错误示范
nums = [3, 1, 2]
result = nums.sort() # result为None!
# 正确做法
nums.sort() # 直接使用原列表
错误2:尝试排序不可排序对象
# 字典直接排序会得到键的列表
data = {"b":2, "a":1}
sorted_keys = sorted(data) # 正确:['a', 'b']
sorted_items = sorted(data.items()) # 正确排序键值对
六、总结对比表
特性 | list.sort() | sorted() |
---|---|---|
适用对象 | 仅列表 | 任意可迭代对象 |
返回值 | None | 新列表 |
原始数据 | 被修改 | 保持不变 |
内存效率 | 高 | 较低 |
时间复杂度 | O(n log n) | O(n log n) |
链式操作支持 | 否 | 是 |
掌握sort()
和sorted()
的正确用法,将使你的Python代码更加高效优雅。根据具体场景灵活选择工具,结合key
参数实现复杂排序逻辑,将大幅提升数据处理能力。