sorted()函数
排序算法在各种程序中都有广泛的应用,排序的核心就是按照某种规则比较所谓的“大小”,然后交换位置,如果是数字,我们可以直接比较,但如果是字符串或者两个字典呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。
Python的内置sorted函数就可以对list进行排序。
>>> sorted([36,5,15,-9,12,24])
[-9, 5, 12, 15, 24, 36]
此外,sorted()也是一个高阶函数,能够包含一个关键字key使待排序的list能按照key的有关规则进行排序,下面就是一个小例子。
>>> sorted([36,-5,4,25,12,-40],key = abs)
[4, -5, 12, 25, 36, -40]
abs就是对list里的所有数字的绝对值进行排序。
然后就是利用sorted函数对子符串进行排序,默认情况下,对字符串排序,是按照ASCII的大小比较的,由于’Z’ < ‘a’,结果,大写字母Z会排在小写字母a的前面。
现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略大小写排序即可。忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。
这样,我们给sorted传入key函数,即可实现忽略大小写的排序:
>>> sorted(['B','LIST','abs','key','wto'])
['B', 'LIST', 'abs', 'key', 'wto']
#默认的ASCII码排序
>>> sorted(['B','LIST','abs','key','wto'],key = str.lower)
['abs', 'B', 'key', 'LIST', 'wto']
#忽略大小写的排序,把大写的字符在排序的阶段进行改写为小写。
前面我们也曾经介绍过,如果想要把什么东西逆置,就需要额外的一个限定条件为reverse = True,排序也不例外,还是上个例子:
>>> sorted(['B','LIST','abs','key','wto'],reverse = True)
['wto', 'key', 'abs', 'LIST', 'B']
>>> sorted(['B','LIST','abs','key','wto'],key = str.lower,reverse = True)
['wto', 'LIST', 'key', 'B', 'abs']
结果显而易见,从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。
小练习
假设我们用一组tuple表示学生名字和成绩:
L = [(‘Bob’, 75), (‘Adam’, 92), (‘Bart’, 66), (‘Lisa’, 88)]
请用sorted()对上述列表分别按名字排序:
>>> def by_name(t):
return t[0].lower()
>>> L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
>>> L2 = sorted(L,key = by_name)
>>> print(L2)
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
再按成绩从高到低排序:
>>> def by_score(t):
return t[1]
>>> L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
>>> L2 = sorted(L,key = by_score)
>>> print(L2)
[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
>>> L2 = sorted(L,key = by_score,reverse = True)
>>> print(L2)
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]