编程Python 开发人员

Python 中的 sorted() 函数是如何工作的,它与列表的 sort() 方法有什么区别,使用键 key 和参数 reverse 时有哪些注意事项?

用 Hintsage AI 助手通过面试

答案。

问题背景:

从一开始,Python 语言就提供了内置的工具来对集合进行排序。sort() 方法和 sorted() 函数是在 Python 的第二个版本中出现的,但自 Python 2.4 起,sorted() 被引入作为对任何可迭代对象(不仅仅是列表)的通用排序工具。

问题:

通常需要根据不同的标准对数据进行排序,并且并不总是希望更改原始对象。初学者常常混淆 sort() 和 sorted(),不了解每个的应用场景,因此在排序键和顺序上容易出错。

解决方案:

  • sorted(可迭代对象, key=None, reverse=False) 始终返回一个新的列表对象,不改变原始对象。
  • list.sort(key=None, reverse=False) 就地(in-place)对列表本身进行排序,并返回 None。
  • 参数 key 是一个函数,定义了排序的标准。
  • reverse=True 将顺序反转。

以下是按字符串长度进行逆序排序的列表示例:

words = ['python', 'is', 'strong', 'language'] sorted_words = sorted(words, key=len, reverse=True) print(sorted_words) # ['language', 'python', 'strong', 'is']

关键特性:

  • sorted() 始终返回一个新的列表,不触及源对象
  • sort() 只对列表本身有效,不返回新对象
  • key 选项可以是任何返回用于比较的值的函数

刁钻问题。

sort() 方法返回什么?

list.sort() 方法对列表本身进行排序,并始终返回 None,这点常常被忽视。

lst = [3, 1, 2] res = lst.sort() print(res) # None print(lst) # [1, 2, 3]

可以使用 sort() 对元组进行排序吗?

不可以,元组是不可变的,没有 .sort() 方法。要进行排序请使用 sorted()。

tuple_data = (5,2,3) sorted_tuple = sorted(tuple_data) print(sorted_tuple) # [2, 3, 5]

如果在 key 中指定一个返回不同类型的函数,会发生什么?

如果返回的值之间不可比较,将引发 TypeError 异常(例如,int 和 str 之间)。

常见错误和反模式

  • 使用 sort(),期望返回一个新的排序列表
  • 尝试使用 sort() 方法对不可变对象进行排序
  • 在 key 中传递一个返回不同类型值的函数

生活中的示例

负面案例

面试时要求返回按长度排序的列表,而候选人这样做:

lst = ['one', 'elephant'] ans = lst.sort(key=len) print(ans) # None

优点:

  • 就地修改列表(有时节省内存)

缺点:

  • 返回 None,破坏后续逻辑

正面案例

正确使用:

lst = ['one', 'elephant'] ans = sorted(lst, key=len) print(ans) # ['one', 'elephant']

优点:

  • 原始列表不被修改
  • 得到预期结果

缺点:

  • 占用额外内存用于新的列表