Python内建的list.sort()方法和sorted()函数都可以实现对列表进行排序。
一、list.sort()方法:list.sort(key=function, reverse=Boolean)
list.sort()方法是对列表list直接进行排序,排序完成后原来的list列表中的元素位置变化,按排序顺序排列。
可选的关键字参数reverse为布尔型数据,设置排序方向,默认值是False,按照升序排序。当reverse值可为True时,按照降序排序。
例如:
1 list1 = [3, 5, 2, 4, 1]
2 list1.sort()
3 print(list1)
输出结果为:
[1, 2, 3, 4, 5]
1 list1 = [3, 5, 2, 4, 1]
2 list1.sort(reverse=True)
3 print(list1)
输出结果为:[5, 4, 3, 2, 1]
该函数必须是只接受一个参数的函数,并且该函数能以列表中的任一元素作为参数进行加工,返回同类型可比数据。
当传入有效的key参数时,list.sort()方法将对列表中的每个元素计算key函数返回值,并根据各元素的key函数计算值来对列表中原有元素进行排序。
例如,当我们对一个以字符串形式存放的浮点数列表排序时,Python是以字符串大小比较规则来排序的:
1 list1 = ['12.3', '4.5', '0.62', '9.54', '1.21']
2 list1.sort()
3 print(list1)
输出结果为:['0.62', '1.21', '12.3', '4.5', '9.54']
如果以float()函数作为参数传递给key,再对该列表进行排序,将会得到按转换成浮点数后的大小排序的字符串列表。
1 list1 = ['12.3', '4.5', '0.62', '9.54', '1.21']
2 list1.sort(key=float)
3 print(list1)
输出结果为:['0.62', '1.21', '4.5', '9.54', '12.3']
还可以自定函数满足个性化排序需求:
1 list1 = ['23', '45', '62', '54', '21']
2
3 def r1(s):
4 return s[-1:]
5
6 list1.sort(key=r1)
6 print(list1)
输出结果为:['21', '62', '23', '54', '45'],即实现了将字符串按最后一个字符的大小排序。
如果列表中有某个元素不能作为key函数的参数进行计算,则会报错:
1 list1 = ['23', '45', 62, '54', '21']
2
3 def r1(s):
4 return s[-1:]
5
6 list1.sort(key=r1)
7 print(list1)
上例中列表的第三个元素62是整数,r1函数只能处理字符串,运行到第4行时会报错:
TypeError: 'int' object is not subscriptable。
下面的例子中,函数r1虽然能对所有元素进行处理,但是每个元素计算后的返回值类型不一样,不能进行比较大小操作:
1 list1 = ['23', '45', ('3', '2'), '54', '21']
2
3 def r1(s):
4 return s[-1:]
5
6 list1.sort(key=r1)
7 print(list1)
列表中第三个元素用r1函数计算后的返回值是一个只有一个元素的元组('2', ),与其他元素计算结果'3', '5', '4', '1'等字符串无法相互比较大小,程序运行到第6行时会报错:
TypeError: '<' not supported between instances of 'tuple' and 'str'
如果把函数r1改一下:
1 list1 = ['23', '45', ('3', '2'), '54', '21']
2
3 def r1(s):
4 return s[-1]
5
6 list1.sort(key=r1)
7 print(list1)
这时第三个元素的计算结果为字符串'2',可以和其他元素计算值比较,排序就能进行了,运行结果为:
['21', ('3', '2'), '23', '54', '45']
这是典型的python崇尚鸭子类型的表现:一群鸭子(字符串)进行游泳比赛(排序),里面混进了一只鸡(元组),但是Python不管这只鸡是不是真鸭子,只要这只穿上脚蹼的鸡能像鸭子一样游泳(截取最后一位的结果为字符串)就行,结果这只鸡就成了获得游泳比赛亚军的“鸭子”。哈,跑题了,今天刚学习了一篇介绍鸭子类型的文章,对鸭子类型有了一点点理解,写到这个例子有感而发。
二、sorted()函数:sorted(iterable, key=function, reverse=Boolean)
sorted()函数以iterable排序后的结果创建有序列表,原可迭代对象iterable保持不变。
例如:
1 tup1 = ('23', '45', ('3', '2'), '54', '21')
2
3 def r1(s):
4 return s[-1]
5
6 list1 = sorted(tup1, key=r1, reverse=True)
7 print('tup1:', tup1)
8 print('list1:', list1)
输出结果:
tup1: ('23', '45', ('3', '2'), '54', '21')
list1: ['45', '54', '23', ('3', '2'), '21']
sorted()函数可以对任何可迭代的对象排序,而list.sort()方法不行。
1 tup1 = ('23', '45', ('3', '2'), '54', '21')
2
3 def r1(s):
4 return s[-1]
5
6 tup1.sort(key=r1, reverse=True)
7 print('tup1:', tup1)
报错:AttributeError: 'tuple' object has no attribute 'sort'