你真的了解Python中的sorted吗?(建议收藏)

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)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值