import functools
class Student(object):
def __init__(self,name,age,classnum):
self.name = name
self.age = age
self.classnum = classnum
# 年齡按照從小到大排序
def sort_age(a,b):
return a.age - b.age
# 先按照班級排好,再按照年齡從大到小排好
def class_and_age(a,b):
if a.classnum!=b.classnum:
return a.classnum-b.classnum
return b.age - a.age
a=Student('111',19,3)
b=Student('222',20,2)
c=Student('333',31,1)
res=[a,b,c]
for i in res:
print('before',i)
print('-----------------------------'*2)
res=sorted(res,key=functools.cmp_to_key(Student.sort_age))
for i in res:
print('after',i)
print('-----------------------------'*2)
res=sorted(res,key=functools.cmp_to_key(Student.class_and_age))
for i in res:
print('after2',i)
返回負數時,a應該排在b的前面
返回正數時,認爲b應該排在a的前面
返回0 時, 誰排在前面都可以
————————————————————————————
上面是自建類,有時候可以用sorted中的cmp來搭配lambda使用。
cmp(x,y)表示如果x-y<0,那麼就是升序排列,如果y-x>0,那就表示降序排列,也對應於負數,a應該排在b的前面的規律。
res=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(res, cmp=lambda x,y:cmp(x[1],y[1]))
res=[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> sorted(res, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]