专业编程基础技术教程

网站首页 > 基础教程 正文

Python中的排序-sorted函数

ccvgpt 2024-08-08 13:18:52 基础教程 13 ℃

本文对Python中的排序函数sorted做一个简单的介绍。注意只对python3.0或以后的版本有效,对于旧版本就不特别说明。

对列表排序

注意sorted函数是不会修改原列表,他会返回一个结果的新列表对象。

Python中的排序-sorted函数

nums=[5,4,3,2,1]
print('源:',nums)
# 默认是升序
res=sorted(nums)
print('sorted:',res)
# 降序只需要设置参数reverse=True
res=sorted(nums,reverse=True)
print('sorted reverse:',res)

输出:

源: [5, 4, 3, 2, 1]
sorted: [1, 2, 3, 4, 5]
sorted reverse: [5, 4, 3, 2, 1]

复杂结构的排序

nums=[
('zhang','A',2),
('wang','B',3),
('L','C',1)
]
res=sorted(nums)
print('sorted:',nums)

输出:

sorted: [('L', 'C', 1), ('wang', 'B', 3), ('zhang', 'A', 2)]

· 可见,正常情况下,只对列表中的元组的第一个元素作为标准进行排序(实际上是对元组进行排序,而元组的比较规则是从第一个元素开始比较,如果相同则依次往后的元素做比较)。

· 需要指定其他的标准作为排序规则,我们可以通过设置key参数

使用参数key进行自定义规则排序

nums=[
('zhang','A',2),
('wang','B',3),
('L','C',1)
]
# 按元组中的第3个元素进行排序
res=sorted(nums,key=lambda x:x[2])
print('sorted:',res)

输出:

sorted: [('L', 'C', 1), ('zhang', 'A', 2), ('wang', 'B', 3)]

使用参数key进行自定义规则排序

nums=[
 ('zhang','A',2),
 ('wang','B',3),
 ('L','C',1)
]
 
# 按元组中的第3个元素进行排序
res=sorted(nums,key=lambda x:x[2])
print('sorted:',res)

输出:

sorted: [('L', 'C', 1), ('zhang', 'A', 2), ('wang', 'B', 3)]
  • 参数key其实是接受一个函数,这个函数必须只有一个入参和返回一个可比较的值。
  • 当sorted函数进行排序,决定谁先谁后的时候,就会把列表中的当前元素传入这个函数,用返回的值来作为判断依据

多字段同时排序

有时候我们需要同时对多个字段进行排序,我们来看看怎么做

nums=[
 ('A',1,'id1'),
 ('B',39,'id2'),
 ('B',38,'id3'),
 ('B',37,'id4'),
 ('C',2,'id5')
] 
 
res=sorted(nums,key=lambda x: (x[0],x[1]) )
print('sorted:',res)

输出:

sorted: [('A', 1, 'id1'), ('B', 37, 'id4'), ('B', 38, 'id3'), ('B', 39, 'id2'), ('C', 2, 'id5')]

这里是利用之前说到的元组比较规则来进行多个字段同时参与排序。因此我们只需要在key中设置的函数中返回一个元组即可

但是,上面的排序只能是单纯的升序或降序。如果需要第一个元素降序,第二个元素升序,怎么做

nums=[
 ('A',1,'id1'),
 ('B',39,'id2'),
 ('B',38,'id3'),
 ('B',37,'id4'),
 ('C',2,'id5')
]
# 要注意调用的顺序,这里是从最后规则开始(也就是先对第二个元素做升序)
res=sorted(nums,key=lambda x: x[1] )
res=sorted(nums,key=lambda x: x[0],reverse=True )
print('sorted:',nums)

输出:

sorted: [('C', 2, 'id5'), ('B', 37, 'id4'), ('B', 38, 'id3'), ('B', 39, 'id2'), ('A', 1, 'id1')]

python的sorted函数是稳定的。就是说如果多个元素有相同的key,则排序前后他们的先后顺序不变。做不一致升降序的时候利用这个前提条件,就可以做到

最后

综合来说,使用sorted函数可以满足一般的排序需求。虽然本文例子的集合都是list,但排序是可以针对其他集合,而集合的元素也是可以是任意的。此外,python提供了一个模块可以让你不需要写lambda即可操作(比如:operator),但个人觉得对于教学来说自己写lambda会更直观。

Tags:

最近发表
标签列表