python 内置的sorted()函数可以对一个list进行排序:
>>> sorted([8,3,8,11,-2])
[-2, 3, 8, 8, 11]
既然说是高阶函数,那么它还可以接受一个key函数来实现自定义的排序,比如按照绝对值大小进行排序:
>>> sorted([8,3,8,11,-9],key=abs)
[3, 8, 8, -9, 11]
key指定的函数将作用于list中的每一个元素上,根据key函数返回的结果进行排序。
来看看字符串排序的问题:
>>> sorted(['abc','Abc','Cba','bAc']) ['Abc', 'Cba', 'abc', 'bAc']
默认的,对于字符串,sorted函数按照ASCII的大小进行排序,因为C<a,大写的C会排在小写的a前面。
如果我们想要达到忽略大小写的排序,只需要更改一下key函数:
>>> sorted(['abc','Abc','Cba','bAc'],key=str.lower) ['abc', 'Abc', 'bAc', 'Cba']
进一步,要进行反向排序,可以传入第三个参数reverse=True:
>>> sorted(['abc','Abc','Cba','bAc'],key=str.lower,reverse=True) ['Cba', 'bAc', 'abc', 'Abc']
sorted()排序的关键在于实现一个映射函数!
练习:一个tuple表示学生的名字和成绩,使用sorted()对这个元祖按照名字排序:
>>> l = [('xiamin',34),('qiang',66),('hong',74),('guan',56)] >>> def by_name(t): ... return t[0] ... >>> def by_score(t): ... return t[1] ... >>> l1 = sorted(l,key=by_name) >>> l1 [('guan', 56), ('hong', 74), ('qiang', 66), ('xiamin', 34)] >>> l2 = sorted(l,key = by_score) >>> l2 [('xiamin', 34), ('guan', 56), ('qiang', 66), ('hong', 74)]
笑声激发自强,发愤、图强、飞身向上