一、列表(list)的成员函数sort:只适用于列表对象的排序,且排序后的结果会修改、覆盖该列表对象。
x = [8, 5, 6, 10, 9, 3, 1, 2]
x.sort()
print('对x按升序排序:', x)
x.sort(reverse=True)
print('对x按降序排序:', x)
对x按升序排序: [1, 2, 3, 5, 6, 8, 9, 10]
对x按降序排序: [10, 9, 8, 6, 5, 3, 2, 1]
二、sorted:属于Python的内置函数,可对任意可迭代对象进行排序,排序的结果以一个新的列表(list)返回,不影响原迭代对象。
print('对字符串“python”进行拆分排序:',sorted('python'))
x = [8, 5, 6, 10, 9, 3, 1, 2]
print('对x按降序排序:', sorted(x, reverse=True))
print('x依然还是原来的x:',x)
对字符串“python”进行拆分排序: ['h', 'n', 'o', 'p', 't', 'y']
对x按降序排序: [10, 9, 8, 6, 5, 3, 2, 1]
x依然还是原来的x: [8, 5, 6, 10, 9, 3, 1, 2]
三、除上述差异外,sort、sorted两者的参数及相关用法完全一致。
# 学生信息:姓名、等级、成绩
students = [('Mike', 'A', 88), ('Jack', 'A', 99),
('Andy', 'B', 77), ('John', 'C', 66)]
# 按姓名排序:
s = sorted(students, key=lambda student: student[0])
print('按姓名排序:', s)
# 先按等级由高到底,在等级相同的情况下再按成绩由高到低排序:
# 注意&思考一下:
# 1.为啥返回的是元组?
# 2.成绩前面为啥有个负号?
s = sorted(students, key=lambda student: (student[1], -student[2]))
print('按等级、成绩排序:', s)
按姓名排序: [('Andy', 'B', 77), ('Jack', 'A', 99), ('John', 'C', 66), ('Mike', 'A', 88)]
按等级、成绩排序: [('Jack', 'A', 99), ('Mike', 'A', 88), ('Andy', 'B', 77), ('John', 'C', 66)]
# 补充一下元组相互比较的知识
# 以下比较均为True:
print(('A', 88) == ('A', 88))
print(('A', 99) > ('A', 88))
print(('A', -99) < ('A', -88))
print(('A', 99) < ('B', 99))
True
True
True
True
总结:sort对列表自己进行排序(“克己”);sorted对迭代对象输出列表格式的排序结果(“利人”)。通过key及reverse关键字参数,灵活运用排序方式。