Python中排序函数sorted的用法

Python中排序函数sorted的用法

列表对象提供了sort()方法支持原地排序,而内置函数sorted()返回新列表,并不对原列表进行任何修改。
sorted()方法可以对列表、元组、字典、range对象等进行排序。
列表的sort()方法和内置函数sorted()都支持key参数实现复杂排序要求。
下面讲解排序函数sorted的用法,该函数可以对列表、元组、字典、集合排序,返回一个列表。

1. 一维列表(元组或集合)排序

(1) 一维列表排序

# 一维列表(元组或集合)排序
list1 = [12, 5, 3, 20, 17, 25, 10, 30]
a = sorted(list1)  # 默认升序排序,返回列表
print(a)
b = sorted(list1, reverse=True)  # 降序排序
print(b)
set1 = {12, 5, 3, 20, 17, 25, 10, 30}
c = sorted(set1)  # 返回的都是列表
print(c)
[3, 5, 10, 12, 17, 20, 25, 30]
[30, 25, 20, 17, 12, 10, 5, 3]
[3, 5, 10, 12, 17, 20, 25, 30]

(2) lambda函数

lambda函数是匿名函数,即不需要函数名,格式为 lambda 参数列表:表达式,表达式表示函数要执行的操作。
对于非常简单的函数,或排序时的参数key,通常使用匿名函数实现。
例如:求解a+b,普通函数和匿名函数的写法。

def add(a, b):  # 普通函数
    return a+b
print(add(2,3))
add = lambda a, b: a + b   # 匿名函数
print(add(2,3))
5
5

(3) 把所有奇数都放到前面,偶数都放到后面

# 一维整数列表,把所有奇数都放到前面,偶数都放到后面
list1 = [19, 32, 76, 82, 23, 63, 38, 50, 20, 30, 39, 14, 19, 50, 81, 27, 77, 12, 55, 29]
a = sorted(list1, key=lambda x: x%2 == 0)
print(a)
[19, 23, 63, 39, 19, 81, 27, 77, 55, 29, 32, 76, 82, 38, 50, 20, 30, 14, 50, 12]

2. 二维列表排序

(1) 第二层是列表、元组或集合

# 二维列表(第二层是列表、元组或集合)排序
list2 = [('Sun', 18), ('Li', 20), ('Zhao', 17), ('Qian', 21), ('Qian', 20)]
# 本题中,匿名函数的参数x,相当与列表中的一个元素,该元素是列表,可以用下标表示列表中的值
# x[0]是姓氏,x[1]是年龄
a = sorted(list2, key=lambda x:x[0])  # 按姓氏升序排序
print(a)
b = sorted(list2, key=lambda x:x[1])  # 按年龄升序排序
print(b)
# 多关键字排序
c = sorted(list2, key=lambda x:(x[0], x[1]))  # 按姓氏升序排序,姓氏相等时按年龄升序排序
print(c)
d = sorted(list2, key=lambda x:(x[0], -x[1]))  # 按姓氏升序排序,姓氏相等时按年龄降序排序
print(d)
[('Li', 20), ('Qian', 21), ('Qian', 20), ('Sun', 18), ('Zhao', 17)]
[('Zhao', 17), ('Sun', 18), ('Li', 20), ('Qian', 20), ('Qian', 21)]
[('Li', 20), ('Qian', 20), ('Qian', 21), ('Sun', 18), ('Zhao', 17)]
[('Li', 20), ('Qian', 21), ('Qian', 20), ('Sun', 18), ('Zhao', 17)]

(2) 第二层是字典

# 二维列表(第二层是字典)排序
list3 = [{'name': 'Dong', 'age': 37}, {'name': 'Zhang', 'age': 40}, {'name': 'Li', 'age': 50}, {'name': 'Dong', 'age': 43}]
# 本题中,匿名函数的参数x,相当与列表中的一个元素,该元素是字典,可以用键做为下标表示字典中的值
# x['name']是名字,x['age']是年龄
a = sorted(list3, key=lambda x:x['name'])  # 按名字升序排序
print(a)
b = sorted(list3, key=lambda x:x['age'])  # 按年龄升序排序
print(b)
# 多关键字排序
c = sorted(list3, key=lambda x:(x['name'],x['age']))  # 按名字升序排序,名字相等时按年龄升序排序
print(c)
d = sorted(list3, key=lambda x:(x['name'],-x['age']))  # 按名字升序排序,名字相等时按年龄降序排序
print(d)
[{'name': 'Dong', 'age': 37}, {'name': 'Dong', 'age': 43}, {'name': 'Li', 'age': 50}, {'name': 'Zhang', 'age': 40}]
[{'name': 'Dong', 'age': 37}, {'name': 'Zhang', 'age': 40}, {'name': 'Dong', 'age': 43}, {'name': 'Li', 'age': 50}]
[{'name': 'Dong', 'age': 37}, {'name': 'Dong', 'age': 43}, {'name': 'Li', 'age': 50}, {'name': 'Zhang', 'age': 40}]
[{'name': 'Dong', 'age': 43}, {'name': 'Dong', 'age': 37}, {'name': 'Li', 'age': 50}, {'name': 'Zhang', 'age': 40}]

3. 字典排序

(1) 字典及其items()排序

# 字典排序
dict1 = {'Sun': 18, 'Li': 20, 'Zhao': 17, 'Qian': 20, 'Chen': 20}
a = sorted(dict1)  # 默认按键升序排序,返回键的列表
print(a)
# 如果对字典按键或者值进行排序,可以对其items()排序
# items()字典的键值对,排序方法类似二维列表
dict1_items = dict1.items()
print(dict1_items)
b = sorted(dict1.items(), key=lambda x:x[0])  # 按键升序排序,返回键值对列表
print(b)
c = sorted(dict1.items(), key=lambda x:x[1])  # 按值升序排序,返回键值对列表
print(c)
d = sorted(dict1.items(), key=lambda x:(x[1], x[0]))  # 按值升序排序,值相同时,按键升序,返回键值对列表
print(d)
['Chen', 'Li', 'Qian', 'Sun', 'Zhao']
dict_items([('Sun', 18), ('Li', 20), ('Zhao', 17), ('Qian', 20), ('Chen', 20)])
[('Chen', 20), ('Li', 20), ('Qian', 20), ('Sun', 18), ('Zhao', 17)]
[('Zhao', 17), ('Sun', 18), ('Li', 20), ('Qian', 20), ('Chen', 20)]
[('Zhao', 17), ('Sun', 18), ('Chen', 20), ('Li', 20), ('Qian', 20)]

(2) 根据另外一个列表的值来对当前列表元素进行排序

# 根据另外一个列表的值来对当前列表元素进行排序,例如,根据年龄列表对姓名列表排序
list1 = ['Sun', 'Li', 'Zhao', 'Qian', 'Chen']  # 姓名
list2 = [18, 20, 17, 20, 20]               # 年龄
pairs = zip(list1, list2)  # 先用zip转成序对,当然也可以继续把序对转成列表或字典
a = sorted(pairs, key=lambda x:(x[1], x[0]))  # 按年龄升序排序,年龄相同时,按姓名升序,返回序对列表
print(a)
b = [x[0] for x in a]  # 按年龄排序后的名字序列
print(b)
[('Zhao', 17), ('Sun', 18), ('Chen', 20), ('Li', 20), ('Qian', 20)]
['Zhao', 'Sun', 'Chen', 'Li', 'Qian']

(3) 字典最大键

# 字典最大键
dict1 = {'Sun': 18, 'Li': 20, 'Zhao': 17, 'Qian': 20, 'Chen': 20}
max_key = max(dict1)  # 字典最大的键(键是字符串类型,按字典序最大)
print(max_key)  
print(dict1[max_key])  # 字典最大的键对应的值
max_key_val = max(dict1.items(), key=lambda x:(x[1], x[0]))  # 字典最大的值对应的键值对,值相同时,取键最大的,返回键值对
print(max_key_val)  
Zhao
17
('Qian', 20)

4. 使用itemgetter实现排序

# 除了匿名函数,还可以导入itemgetter,调用第几项
from operator import itemgetter

dict1 = {'Sun': 18, 'Li': 20, 'Zhao': 17, 'Qian': 20, 'Chen': 20}
a = sorted(dict1.items(), key=itemgetter(0))  # 按键升序排序,返回键值对列表
print(a)
b = sorted(dict1.items(), key=itemgetter(1))  # 按值升序排序,返回键值对列表
print(b)
c = sorted(dict1.items(), key=itemgetter(1,0))  # 按值升序排序,值相同时,按键升序,返回键值对列表
print(c)
d = sorted(dict1.items(), key=lambda x:(x[1], x[0]))  # 按值升序排序,值相同时,按键升序,返回键值对列表,与上面方法等效
print(d)
[('Chen', 20), ('Li', 20), ('Qian', 20), ('Sun', 18), ('Zhao', 17)]
[('Zhao', 17), ('Sun', 18), ('Li', 20), ('Qian', 20), ('Chen', 20)]
[('Zhao', 17), ('Sun', 18), ('Chen', 20), ('Li', 20), ('Qian', 20)]
[('Zhao', 17), ('Sun', 18), ('Chen', 20), ('Li', 20), ('Qian', 20)]
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趣学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值