书接上文,咱们接着说:
3.Operator 模块函数:
上面显示的键函数模式非常常见,因此 Python 提供了便利功能,使访问器功能更容易,更快捷。operator
模块有 itemgetter() 、attrgetter() 和 methodcaller() 函数。
使用这些函数,上述示例变得更简单,更快捷:
import operator
students = [
student('Alice', 80, 18),
student('Bob', 90, 19),
student('Charlie', 70, 17),
student('David', 85, 18)
]
student_tuple = [(s.name, s.score, s.age) for s in students]
sorted_student_tuple2 = sorted(student_tuple, key=operator.itemgetter(0))
print(sorted_student_tuple2)
sorted_students = sorted(students, key=operator.attrgetter('score'))
print(sorted_students)
4.升序和降序:
list.sort() 和 sorted() 接受布尔值的 reverse 参数。这用于标记降序排序。例如,要以反向 age 顺序获
取学生数据:
sorted(student_tuple, key=itemgetter(2), reverse=True)
sorted(students , key=attrgetter('age'), reverse=True)
5.排序稳定性和复杂度:
排序保证是 稳定 的。这意味着当多个记录具有相同的键值时,将保留其原始顺序。
data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
注意 blue 的两个记录如何保留它们的原始顺序,以便 (‘blue’, 1) 保证在 (‘blue’, 2) 之前。
这个美妙的属性允许你在一系列排序步骤中构建复杂的排序。例如,要按 grade 降序然后 age 升序对学生数
据进行排序,请先 age 排序,然后再使用 grade 排序:
s = sorted(students, key=attrgetter('age')) # sort on secondary key
>>> sorted(s, key=attrgetter('grade'), reverse=True) # now sort on primary key,descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]