3、sorted
Python内置的sorted()
函数就可以对list进行排序。
sorted()
函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序,例如按绝对值大小排序:
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。对比原始的list和经过key=abs
处理过的list:
list = [36, 5, -12, 9, -21]
keys = [36, 5, 12, 9, 21]
然后sorted()
函数按照keys进行排序,并按照对应关系返回list相应的元素:
keys排序结果 => [5, 9, 12, 21, 36]
| | | | |
最终结果 => [5, 9, -12, -21, 36]
例1:用一组tuple表示学生名字和成绩,分别按名字排序;再按成绩从高到低排序。
def by_name(t):
return t[0]
#by_score和by_score2都是对分数进行由高到低排序
def by_score(t):
return -t[1] #对分数取负
def by_score2(t):
return t[1] #取分数,然后调用时使得reverse=True
students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
#注意:key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
print(sorted(students,key=by_name))
print(sorted(students,key=by_score))
print(sorted(students,key=by_score2,reverse=True))
输出结果:
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
itemgetter
通过使用operator 模块的itemgetter 函数,可以非常容易的排序这样的数据结构
from operator import itemgetter
rows = [{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
print(sorted(rows,key=itemgetter('fname'))) #按fname进行排序
print(sorted(rows,key=itemgetter('uid'))) #按uid进行排序
输出结果:
[{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
[{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
例1类似可直接写成:
from operator import itemgetter
students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
print(sorted(students,key=itemgetter(1),reverse=True)) #按分数降序排序
输出结果:
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]