![ed0c064b504226e805f5d8a76234c3c5.png](https://i-blog.csdnimg.cn/blog_migrate/1dfe48ce951e0d01866273408fcae89a.jpeg)
引自《Fluent Python》影印版P42,比较list.sort和内建sorted函数。以及官方文档。
list.sort
list.sort方法将对该list就地(in place)做排序,即不生成新对象(不对原对象做拷贝)。该函数返回None,表明对原对象做修改。
Python中API的不成文的规定:标明返回None的函数,表明对该对象原地(in place)修改,即修改原对象,无新对象产生。但这样也有一个缺点:无法串联使用。比如,无法这样编写代码:(list.sort).sort
sorted Built-in Function
相反,内置的sorted函数可以创造并返回一个新的list。其实sorted函数可接受任意的iterable object,包括不可变序列和生成器。
相同点
两者都只接受两个参数:reverse和key
- reverse : 如果为True,代表降序排列,默认为False
- key:一个只有一个参数的函数,这个函数会被用在序列里的每一个元素上,所产生的结果将是排序算法依赖的对比关键字。比如说,在对一些字符串排序时,可以用key=str.lower 来实现忽略大小写的排序,或者是用 key=len 进行基于字符串长度的排序。
为了更好的理解,请阅读如下代码:
fruits
key的应用
上节提到的key参数,为排序时的比较算法提供了很大的灵活性。举个例子:
student_tuples
上例子中,用lambda函数定义了比较算法(即提取学生成绩),将其赋予key。
同样也可以用于object实例:
class
Operator Module Functions
由于在Python中经常需要key-function模式的参数,所以提供了方便的用于容易、快速的访问函数。即 operator模块下的itemgetter(),attrgetter(),和methodcaller().
直接看例子:
from
operator模块函数还允许多层排序,比如先按成绩排序,再按年龄排序:
sorted