在Python中,有内置的排序方法:sorted(iterable, key, reverse)。
Sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序。key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
print(sorted([1,34,-5,55,-100,12]))
直接像上面对数字进行的排序,得到的结果为下面:
[-100, -5, 1, 12, 34, 55]
这是对简单的排序,但是如果按照绝对值进行排序,就可以利用key
print(sorted([1,34,-5,55,-100,12],key=abs))
加上key,按照绝对值进行排序,得到的结果如下所示:
[1, -5, 12, 34, 55, -100]
这是对key的简单利用,当然我们还能够自己定义函数来排序。
def ad(x):
return x*(-1)
print(sorted([1,34,-5,55,-100,12],key=ad))
如上定义了一个函数ad(),这个函数就是取反,按照取反之后的结果进行排序,得到下面的结果:
[55, 34, 12, 1, -5, -100]
这也是对key的简单运用,通过自己定义函数的方法。
sorted()除了对纯数字进行排序以外,还能够对字符串进行排序,按照ASCII的顺序进行排序
print(sorted(['as','xp','junjun','XX','zp','www','+']))
print(sorted(['as','xp','junjun','XX','zp','www','+'],key=str.lower))
print(sorted(['as','xp','junjun','XX','zp','www','+'],key=str.lower,reverse=True))
如上为对字符串进行排序,如下为结果:
['+', 'XX', 'as', 'junjun', 'www', 'xp', 'zp']
['+', 'as', 'junjun', 'www', 'xp', 'XX', 'zp']
['zp', 'XX', 'xp', 'www', 'junjun', 'as', '+']
通过对比,可以发现,先特殊字符,再大写字母,再小写字母。如果加上key=str.lower来排序,所排序出来的字符串不区分大小写。若加上reverse=True,则是按照相反的顺序来排序。
练习:假设我们用一组tuple表示学生名字和成绩:
L = [('Bob',75),('Adam',92),('Xp',100),('Junjun',1)]
请用sorted()对上述列表分别按名字和成绩排序:
#按照名字排序
def by_name(t):
return t[0].lower()
#按照成绩排序
def by_score(t):
return t[1] L = [('Bob',75),('Adam',92),('Xp',100),('Junjun',1)]
L2 = sorted(L, key = by_name)
print(L2)
L3 = sorted(L, key = by_score)
print(L3)
上面练习的结果为:
[('Adam', 92), ('Bob', 75), ('Junjun', 1), ('Xp', 100)]
[('Junjun', 1), ('Bob', 75), ('Adam', 92), ('Xp', 100)]
【分析】
L列表中的每个元素都是一个元组,首先按名字排序,key作用与排序中列表里的每一个元素,所以传入by_name里的参数t是一个元组,需要对元组的第一个元素进行排序,所以是t[0]。所以说他[0]就是元组的第一个字段name,而相应的t[1]就是元组的第二个字段score。