聊一聊Python的sort函数

在平常的开发中,排序是一个经常会用到的功能。Python提供了sort和sorted函数来进行排序。
sort函数是list类型的一个方法,调用后直接对list本身进行排序。sorted则是输入一个list对象作为参数,返回一个排序完毕的list。
如下代码所示:

a = [5,4,3,2,1]
print sorted(a)

当然上面是一个非常简单的案例,我们接下来讲一下sort函数的参数:
参数reverse指的是排序结果是降序还是升序,默认是升序(此时值为False)
cmp是早期版本的Python提供的一个用于判断排序顺序的参数,它的传入值为一个函数compare(x,y),compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0,如下所示:

l = [(1,2), (3,4), (5,0)]
l.sort(cmp=lambda it1, it2:it1[1]-it2[1])
print l

输出值为[(5, 0), (1, 2), (3, 4)]。可以看到它是按照列表每个元素中第二个数为依据,按照从小到大的顺序排序的。
在Python2.4以后,加入了key参数,进一步简化了函数的形式。传入的函数只有一个参数,返回一个值,sort或sorted函数将根据返回值来作为排序的依据:

l = [(1,2), (3,4), (5,0)]
l.sort(key=lambda it:it[1])
print l

得到的结果也是[(5, 0), (1, 2), (3, 4)]。可以说形式上比cmp要简单了一些。
如果key和cmp都传入,并且二者之间还是矛盾的话会怎么样呢?我自己还真试了一下,结果发现程序报错了:

l = [(1,2), (3,4), (5,0)]
print sorted(l, key=lambda it:it[0], cmp=lambda it1, it2:it1[1]-it2[1])

输出为:

Traceback (most recent call last):
  File "F:MyDocumentspython	est", line 2, in <module>
    print sorted(l, key=lambda it:it[0], cmp=lambda it1, it2:it1[1]-it2[1])
  File "F:MyDocumentspython	est", line 2, in <lambda>
    print sorted(l, key=lambda it:it[0], cmp=lambda it1, it2:it1[1]-it2[1])
TypeError: 'int' object has no attribute '__getitem__'

因此,平时这两个参数之间也不要混用。在Python3.4以后,为了避免歧义,已经将cmp函数删掉了。

原文地址:https://www.cnblogs.com/wickedpriest/p/12342557.html