Python 的 sort 和 sorted 函数的区别
引言
在 Python 中,sort()
和 sorted()
函数都是用于对列表或数组中的元素进行排序的。虽然它们有着相似的功能,但在用法和行为上却存在一些关键的区别。本文将深入探讨这两者的差异,帮助你理解何时使用哪种函数。
sort()
函数
sort()
函数直接对列表本身进行就地排序,这意味着它将修改原始列表中的元素顺序。语法如下:
python
list.sort([key, reverse])
其中:
key
:用于比较元素的可选关键字函数reverse
:可选参数,指定是否反向排序(降序)
sorted()
函数
sorted()
函数不修改原始列表,而是返回一个已排序的新列表。语法如下:
python
sorted(iterable, key, reverse)
其中:
iterable
:要排序的可迭代对象,可以是列表、元组或其他可迭代对象key
:可选关键字函数,用于比较元素reverse
:可选参数,指定是否反向排序(降序)
主要区别
| 特征 | sort()
| sorted()
|
|—|—|—|
| 修改原始列表 | 是 | 否 |
| 返回类型 | 无 | 排序后的列表 |
| 可变性 | 仅适用于可变对象(如列表) | 可用于可变和不可变对象 |
| 内存消耗 | 就地排序,消耗更少内存 | 创建新列表,消耗更多内存 |
| 并发性 | 可能导致并发问题,因为在排序过程中列表被修改 | 不存在并发问题,因为原始列表不会被修改 |
使用指南
使用 sort()
的场景:
- 当需要直接修改原始列表的顺序时
- 当需要就地排序,节省内存时
- 当排序的列表较大,不希望创建新的副本时
使用 sorted()
的场景:
- 当需要获取排序后的新列表时
- 当需要避免对原始列表进行修改时
- 当需要对不可变对象(如元组)进行排序时
- 当需要并发访问列表时(排序过程不会修改原始列表)
性能考虑
sort()
函数通常比 sorted()
函数更有效率,因为它直接对列表本身进行就地排序,避免了创建新列表的开销。此外,sort()
函数是原生的 CPython 实现,而 sorted()
函数是使用 Python 实现的,可能会引入额外的开销。
示例
以下示例演示了 sort()
和 sorted()
函数的不同用法:
“`python
使用 sort() 对列表就地排序
mylist = [5, 2, 8, 3, 1]
mylist.sort()
print(my_list) # 输出:[1, 2, 3, 5, 8]
使用 sorted() 创建一个排序后的新列表
newlist = sorted(mylist)
print(new_list) # 输出:[1, 2, 3, 5, 8]
对列表降序排序
mylist.sort(reverse=True)
print(mylist) # 输出:[8, 5, 3, 2, 1]
使用自定义比较器对列表排序
mylist = [(‘John’, 30), (‘Alice’, 25), (‘Bob’, 40)]
mylist.sort(key=lambda x: x[1])
print(my_list) # 输出:[(‘Alice’, 25), (‘John’, 30), (‘Bob’, 40)]
“`
常见问题解答
1. 什么时候应该使用 sort()
,什么时候应该使用 sorted()
?
- 使用
sort()
当需要对原始列表进行就地排序时,使用sorted()
当需要获取排序后的新列表时。
2. sort()
和 sorted()
函数的效率哪一个更高?
sort()
函数通常比sorted()
函数更有效率,因为它直接对列表本身进行就地排序。
3. sorted()
函数支持哪些额外的功能?
sorted()
函数支持使用关键字函数作为比较器,允许更灵活的排序。
4. 如何对列表进行降序排序?
- 使用
sort()
函数,可以通过将reverse
参数设置为True
来进行降序排序。使用sorted()
函数,可以通过将reverse
参数设置为True
来实现降序排序。
5. sort()
函数是否可以对不可变对象进行排序?
- 不,
sort()
函数只能对可变对象(如列表)进行排序。要对不可变对象进行排序,请使用sorted()
函数。
原创文章,作者:谭明烟,如若转载,请注明出处:https://www.wanglitou.cn/article_44914.html