问题背景:
从一开始,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']
关键特性:
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 之间)。
面试时要求返回按长度排序的列表,而候选人这样做:
lst = ['one', 'elephant'] ans = lst.sort(key=len) print(ans) # None
优点:
缺点:
正确使用:
lst = ['one', 'elephant'] ans = sorted(lst, key=len) print(ans) # ['one', 'elephant']
优点:
缺点: