说说 Python 中 list.sort()方法与函数sorted() 之间的区别

(1) list.sort() 方法

list.sort() 方法就地排序,也就是说会直接作用于当前列表,直接把当前列表变为已排序的列表。它会返回 None。在 Python 中 ,如果一个函数或者方法对对象进行的是就地改动操作,一般来说,它们会返回 None。这样做的目的是让 API 的使用者知道这个函数或者方法是就地改动操作。比如 random.shuffle 函数也有这个特性。

shuffle() 方法会将序列的所有元素进行随机排序。

有利就有弊,因为这些函数或者方法只能返回 None,所以无法像流式编程那样将其一个个串联起来。

(2) 内置函数 sorted()

内置函数 sorted,接受任何形式的可迭代对象作为入参,内部会新建一个列表作为返回值。

(3)关键字参数

list.sort() 方法与 内置函数 sorted() 都有以下两个可选的关键字参数。

关键字参数 默认值 说明
reverse False 是否逆序
key 值排序 排序算法;str.lower:忽略大小写的排序;len:基于字符串长度的排序

(4)示例

Luciano Ramalho 举了这样一个示例来说明list.sort()方法与函数sorted() 之间的区别。

fruits=['grape','raspberry','apple','banana']
result=sorted(fruits)
logging.info('sorted(fruits) -> %s',result)
logging.info('fruits -> %s',fruits)

result=sorted(fruits,reverse=True)
logging.info('sorted(fruits,reverse=True) -> %s',result)

result=sorted(fruits,key=len)
logging.info('sorted(fruits,key=len) -> %s',result)

result=sorted(fruits,reverse=True,key=len)
logging.info('sorted(fruits,reverse=True,key=len) -> %s',result)

result=fruits.sort()
logging.info('sort() -> %s',result)
logging.info('fruits.sort() from fruits-> %s',fruits)

运行结果:

INFO - sorted(fruits) -> ['apple', 'banana', 'grape', 'raspberry']
INFO - fruits -> ['grape', 'raspberry', 'apple', 'banana']
INFO - sorted(fruits,reverse=True) -> ['raspberry', 'grape', 'banana', 'apple']
INFO - sorted(fruits,key=len) -> ['grape', 'apple', 'banana', 'raspberry']
INFO - sorted(fruits,reverse=True,key=len) -> ['raspberry', 'banana', 'grape', 'apple']
INFO - sort() -> None
INFO - fruits.sort() from fruits-> ['apple', 'banana', 'grape', 'raspberry']

可以看到 list.sort() 方法是就地排序,而函数sorted() 不影响原对象,它会返回一个已排好序的新对象。

推荐阅读更多精彩内容