Python面试题:列表的sort方法与sorted函数都可以对列表排序,有何区别
今天咱们来聊聊一个在面试中经常碰到的“排序”问题。没错,就是Python中的 sort() 方法和 sorted() 函数,它们都是用来对列表进行排序的,但到底有啥区别呢?听着简单,实际上里面还真有不少细节,搞懂了,面试时候就能轻松应对。
1. 先看 sort() 方法
sort() 是列表对象自带的一个方法,也就是说,它只能作用于列表对象。而且,它直接在原列表上进行排序,修改的是原列表,不会返回新列表。
举个简单的例子:
# 初始化一个列表
my_list = [3, 1, 2, 5, 4]# 使用 sort() 排序
my_list.sort()
# 打印排序后的列表
print(my_list) # 输出: [1, 2, 3, 4, 5]
看到没?my_list.sort() 完成了排序操作,而且直接修改了 my_list 本身。排序后,我们看到的就是修改后的原列表。
总结:
sort()是列表对象的方法,只能用在列表上。它会原地排序,直接修改原列表。 返回值是 None,所以你不能链式调用。
2. 再看 sorted() 函数
sorted() 是一个内置函数,可以对任何可迭代对象进行排序,不仅限于列表。所以,你可以用它来排序列表、元组、字符串,甚至字典。
另外,sorted() 会返回一个新的排序后的列表,而不会修改原始对象。这一点非常重要,因为它让你可以在不改变原数据的情况下得到一个排序后的新列表。
来看个例子:
# 初始化一个列表
my_list = [3, 1, 2, 5, 4]# 使用 sorted() 排序
new_list = sorted(my_list)
# 打印排序后的新列表
print(new_list) # 输出: [1, 2, 3, 4, 5]
# 查看原列表是否被修改
print(my_list) # 输出: [3, 1, 2, 5, 4]
这里可以看到,sorted() 返回了一个新的排序后的列表,而 my_list 本身并没有被修改。
总结:
sorted()是一个函数,可以对任何可迭代对象进行排序。它不会修改原始数据,而是返回一个新的排序列表。 与 sort()不同,sorted()可以用于元组、字符串等其他数据类型。
3. 使用 key 和 reverse 参数的区别
不管是 sort() 还是 sorted(),它们都有 key 和 reverse 参数,用来定制排序规则。这两个参数看起来很相似,实则使用时也有一些区别。
key 参数
key 参数是用来指定一个函数,用于提取排序依据。也就是说,它会根据你提供的函数对列表中的每一个元素进行“映射”,然后按照映射后的结果进行排序。
比如,如果你有一个字符串列表,想按字符串的长度进行排序,可以这样:
my_list = ['apple', 'banana', 'cherry', 'date']# 使用 key 按字符串长度排序
my_list.sort(key=len)
print(my_list) # 输出: ['date', 'apple', 'banana', 'cherry']
这里 key=len 就是给每个字符串计算长度,按照长度进行排序。
reverse 参数
reverse 参数可以让你决定是升序(默认)还是降序排序。它接受一个布尔值,如果是 True,就是降序排序。
my_list = [3, 1, 2, 5, 4]# 降序排序
my_list.sort(reverse=True)
print(my_list) # 输出: [5, 4, 3, 2, 1]
你也可以将 reverse 和 key 参数一起使用,得到更灵活的排序结果。
my_list = ['apple', 'banana', 'cherry', 'date']# 按字母排序,但按降序排列
my_list.sort(key=len, reverse=True)
print(my_list) # 输出: ['banana', 'cherry', 'apple', 'date']
4. 性能差异
很多面试官会问,sort() 和 sorted() 在性能上有没有区别。这个问题其实并不复杂,答的好会让面试官刮目相看。
sort()是就地排序,它的时间复杂度是 O(n log n),因为它会修改原列表,所以是原地排序,避免了额外的内存开销。sorted()也会用类似的排序算法(Timsort),时间复杂度同样是 O(n log n),但是它会返回一个新的列表,所以在排序过程中会占用额外的内存。
所以,如果你只关心排序后的列表,不需要保留原列表的数据,那么 sort() 是更优的选择,因为它省去了额外的内存开销。而如果你需要保留原列表的顺序,sorted() 则更加合适。
5. 两者的区别总结
| 特性 | sort() | sorted() |
|---|---|---|
| 是否修改原列表 | 是 (原地排序) | 否 (返回一个新的列表) |
| 可用对象 | 只能用于列表 | 可用于任何可迭代对象 (列表、元组、字典等) |
| 返回值 | None (原地修改,不返回新列表) | 返回一个新的排序列表 |
| 排序方式 | 升序或降序,使用 key 和 reverse 参数 | 同 sort(), 返回新排序列表 |
6. 总结:什么时候用 sort(),什么时候用 sorted()?
如果你只关心排序结果,并且不需要保留原始数据,使用 sort()。如果你希望保留原始数据,并且需要一个新的排序列表,使用 sorted()。
这一点看似简单,但如果你不理解,面试的时候很容易踩坑。尤其是在实际开发中,选择合适的排序方法可以提高代码效率和可读性。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。