【题】
假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()
对上述列表分别按名字排序:
# 按名称排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0].lower()
L2 = sorted(L, key=by_name)
print(L2)
运行结果:
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
【说明】
关于索引:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
L[0]是('Bob', 75)
L[0][0] 是"Bob"
以此类推
这里,需要理解:
- sorted()排序的关键在于实现一个映射函数。
- key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
- 最终结果:按照key函数作用后的顺序的对应关系,返回原list相应的元素
那么实际上by_name这个函数的参数是L中的每个元素,即列表中的tuple元祖。
所以,对列表中内容,按照名称排序:
- by_name函数要达到的目的是:将tuple的第一个元素,即名称字符串t[0],用lower()函数做全部小写处理,并返回结果。
- sorted()函数将by_name函数一一作用于L上的每个元祖上,并根据函数结果的顺序,对原L中原元素排序。
同理,可以实现 再按成绩从高到低排序:
# 按成绩从高到低排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_score(t):
return t[1]
L2 = sorted(L, key=by_score,reverse=True)
print(L2)
运行结果:
[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
题目来自廖雪峰老师的博客: