早在学习perl的时候就总结过排序问题 Schwartzian Transform(施瓦茨变换)
现在,我们来看看在python中如何实现:
Schwartzian transform的中心思想就是Decorate-Sort-Undecorate
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
s1 = Student('Ace', 'S', 12)
s2 = Student('David', 'A', 10)
s3 = Student('Jie', 'S', 13)
s4 = Student('Shawn', 'A', 11)
students = [ s1, s2, s3, s4 ]
decorated = [(s.grade, s.age, s) for s in students]
decorated.sort()
#undecorate
sorted_students = [ s for _,_,s in decorated ]
print sorted_students
# [('David', 'A', 10), ('Shawn', 'A', 11), ('Jie', 'S', 12), ('Ace', 'S', 13)]
当然,既然用了python,就应该pythonic到底,试试下面的方法吧:
print sorted(students, key=lambda s: s.grade and s.age)
from operator import attrgetter
print sorted(students, key=attrgetter('grade', 'age'))