Python技术迷

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高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。