sorted(iterable,[reverse,key])
首先简单看一下sorted()方法的介绍
sorted()
运行原理:
把可迭代数据里面的元素,一个一个的取出来,放到key这个函数中进行处理,
并按照函数中return的结果进行排序,返回一个新的列表
功能: 排序
参数:
iterable 可迭代的数据 (容器类型数据,range数据序列,迭代器)
reverse 可选,是否反转,默认为False,不反转, True反转
key 可选, 函数,可以是自定义函数,也可以是内置函数
返回值: 排序后的结果
我们最常使用sorted就是将一些数字按照升序/降序排序:
arr = [3,7,1,-9,20,10]
print(sorted(arr))#默认升序
print(sorted(arr,reverse=True))#reverse=True 降序排序
[-9, 1, 3, 7, 10, 20]
[20, 10, 7, 3, 1, -9]
但有时候我们会遇到比较复杂的问题,可能需要对排序结果有一些其他的限制等等。
比如:当你想按照绝对值大小来进行升序排序的话,可以传入一个abs()函数
arr = [3,7,1,-9,20,10]
print(sorted(arr,key=abs))#设置参照函数为abs()
[1, 3, 7, -9, 10, 20]
甚至你想先按照偶数升序排序,再按照奇数升序排序,那么此时需要你自定义一个函数func():
def func(num):
return num % 2
arr = [3,2,4,6,5,7,9]
print(sorted(arr,key=func))
[2, 4, 6, 3, 5, 7, 9]
如果你想更加简洁,可以直接传入一个lamda函数
sorted(arr,key=lambda x:x%2)
sorted也可以通过 key 的值来进行数组/字典的排序:
array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
array = sorted(array,key=lambda x:x["age"])#指定按照字典中的"age"来排序
[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]
先参照成绩降序排序,相同成绩的按照名字升序排序:
d1 = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
l = sorted(d1, key=lambda x:(-x['score'], x['name']))#优先按照成绩降序,其次按照名字升序排序
print(l)
[{'name': 'alice', 'score': 38}, {'name': 'christ', 'score': 28}, {'name': 'darl', 'score': 28}, {'name': 'bob', 'score': 18}]
也可以指定第几个字段进行排序:
#假设L是一个元素为3元组的列表,其中每个元组的元素分别代表:姓名、年龄、薪资
L = [('Bob', 25,4300), ('Adam', 32,12000), ('Bart', 16,2000), ('Lisa', 48,9999)]
print(sorted(L,key=lambda x:x[0]))#按照姓名排序
print(sorted(L,key=lambda x:x[1]))#按照年龄排序
print(sorted(L,key=lambda x:x[2]))#按照薪资排序
[('Adam', 32, 12000), ('Bart', 16, 2000), ('Bob', 25, 4300), ('Lisa', 48, 9999)]
[('Bart', 16, 2000), ('Bob', 25, 4300), ('Adam', 32, 12000), ('Lisa', 48, 9999)]
[('Bart', 16, 2000), ('Bob', 25, 4300), ('Lisa', 48, 9999), ('Adam', 32, 12000)]
年龄相同的话按照薪资降序排序:
L = [('Bob', 25,4300), ('Adam', 32,12000), ('Bart', 32,2000), ('Lisa', 48,9999)]
print(sorted(L,key=lambda x:(x[1],-x[2])))
[('Bob', 25, 4300), ('Adam', 32, 12000), ('Bart', 32, 2000), ('Lisa', 48, 9999)]