前言
刷题的时候遇到要对一个列表里第一个元素升序,在第一个元素相同的时候降序的操作。
python应该有简单的方法所以顺便总结一下python list 里的sort
1. 基本排序
在python中有两种排序方法
- sorted(iterable, cmp=None, key=None, reverse=False)
iterable – 可迭代对象。
key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。 - list.sort(cmp=None, key=None, reverse=False)
简单的升序排序非常简单:只需调用 sorted() 函数。它返回一个新的排序后列表
你也可以使用 list.sort() 方法,它会直接修改原列表(并返回 None 以避免混淆),通常来说它不如 sorted() 方便 ——— 但如果你不需要原列表,它会更有效率。
a = [2,5,3,4,6,8,5]
print('sorted a is: ',sorted(a))
# sorted a is: [2, 3, 4, 5, 5, 6, 8]
a.sort()
print('sorted a is: ',a)
# sorted a is: [2, 3, 4, 5, 5, 6, 8]
2. 使用key排序
students = [(‘jane’,‘B’, 16), (‘dave’,‘A’, 14), (‘Amy’, ‘C’, 15), (‘john’,‘A’, 15), (‘Bob’, ‘B’, 14),]
按成绩排序
key = lambda x: x[1]
students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
sorted(students, key = lambda x: x[1])
students.sort(key = lambda x: x[1])
print(students)
# [('dave', 'A', 14), ('john', 'A', 15), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]
成绩相同按年龄降序
上面结果中(‘dave’, ‘A’, 14), (‘john’, ‘A’, 15)成绩相同,年龄是升序, 想变成降序
students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
def multisort(s, specs):
for keyid, reverse in reversed(specs):
s.sort(key = lambda x: x[keyid], reverse = reverse)
return s
print(multisort(students, ((1, False),(2, True))))
# [('john', 'A', 15), ('dave', 'A', 14), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]
可以看见结果中前两项发生了反转, 按年龄降序排列了。
注意这里对specs遍历的时候是反向遍历的
还有一种相对简单的写法
如果需要降序的是数字的话可以这样, 因为数字的负数升序就是原数组降序
students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
print(sorted(students, key = lambda x: (x[1], -x[2])) )
# [('john', 'A', 15), ('dave', 'A', 14), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]