Python中高阶函数sorted()用法

在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。 

posted @ 2018-01-09 16:11  怡安  阅读(582)  评论(0编辑  收藏  举报