python数字排序_python下使用sort()函数对目录下文件名进行多条件排序

1.基础函数

a.sort()函数

sort()函数的作用是对列表内容进行正向排序,直接在原列表进行修改,返回的是修改后的列表。

lists =[1, 5, 10, 8, 6]

lists.sort()

print(lists)

>>> [1, 5, 6, 8, 10]

file_list=['file1', 'file101', 'file102', 'file103', 'file11',

'file12','file13', 'file2', 'file21', 'file22', 'file23', 'file3']

# 文件夹名 按数字排序

file_list.sort(key=lambda x: int(x[4:])) # [4:]表示从字符第4位后开始排序

print(file_list)

# ['file1', 'file2', 'file3', 'file11', 'file12', 'file13',

# 'file21', 'file22', 'file23', 'file101', 'file102', 'file103']

b.sorted()函数

sorted()函数的作用是对列表进行排序后,返回一个新的列表,而原列表不变。并且sorted()方法可以用在任何数据类型的序列中,而返回的总是一个列表的形式。

lists = [1, 5, 10, 8, 6]

a = sorted(lists)

print(lists)

>>>[1, 5, 10, 8, 6]

print(a)

>>>[1, 5, 6, 8, 10]

c.多条件排序

进行多条件排序的话,用sort()函数或者sorted()函数都可以。例子这边用的sort()函数,使用参数key,其返回的顺序就是按照元组的顺序 。如果想要第一个顺序,第二个逆序,只需要在 x[1] 前面加上 -x[1]。

lists = [(2, 5), (2, 3), (1, 2), (4, 2), (3, 4)]

lists.sort(key=lambda x: (x[0], x[1]))

print(lists)

>>>[(1, 2), (2, 3), (2, 5), (3, 4), (4, 2)]

2.例子解析

我需要的是把Mframes0_EPI1.png,Mframes0_EPI10.png,Mframes0_EPI2.png,Mframes1_EPI10.png,Mframes10_EPI10.png,Mframes2_EPI10.png,Mframes2_EPI2.png这样一系列的文件名进行排序。在字符型的数字比较中,10是排在2前面的,即Mframes0_EPI10.png的排序在Mframes0_EPI2.png前面,而我需要的是将Mframes0_EPI2.png排在Mframes0_EPI10.png前面。如果单纯的数字比较的话,直接加个int转化为整型即可实现,但是这边的文件名不单包含了数字还包含了字母和格式。这就需要对文件名进行分割再排序的处理。

split()函数

split()函数的作用是将一个字符串分裂成多个字符串组成的列表。

L = '+100+200+300+400+500+'

print(L.split('+')) # 以''+''号为分割符

# 执行结果:['', '100', '200', '300', '400', '500', '']

使用split()函数进行多符号分割

调用re模块中的split()函数可以用多个符号进行分割。

import re

words = '我,来。上海?吃?上海菜'

wordlist = re.split(',|。|?',words)

print(wordlist)

# output:['我', '来', '上海', '吃', '上海菜']

对文件名进行分割再排序

再回过头看例子。因为文件名Mframes0_EPI1.png中包含字母和格式,无法对其整体取整型int()处理排序。所以需要对文件名进行分割后排序。

20200327134919254.png

如上图所示,通过re.split()函数进行多符号分割,将Mframes0_EPI1.png中的Mframes、_EPI和.png去掉,然后通过sort()函数将留下的数字0和1取整型int(),最后按第一优先级和第二优先级进行排序(也就是先排0这边的数字,再排1那边的数字)。

完整代码如下:

valid_hr_img_list = ['Mframes0_EPI1', 'Mframes0_EPI10', 'Mframes0_EPI11', 'Mframes0_EPI12',

'Mframes0_EPI13', 'Mframes0_EPI14', 'Mframes0_EPI15', 'Mframes0_EPI16','Mframes0_EPI17',

'Mframes0_EPI18', 'Mframes1_EPI10', 'Mframes3_EPI10', 'Mframes4_EPI10', 'Mframes399_EPI96',

'Mframes0_EPI19', 'Mframes0_EPI2', 'Mframes0_EPI20']

valid_hr_img_list.sort(key=lambda x: (int(re.split('Mframes|_EPI|.png',x)[1]),int(re.split('Mframes|_EPI|.png',x)[2])))

print(valid_hr_img_list)

# ['Mframes0_EPI1', 'Mframes0_EPI2', 'Mframes0_EPI10', 'Mframes0_EPI11', 'Mframes0_EPI12',

# 'Mframes0_EPI13', 'Mframes0_EPI14', 'Mframes0_EPI15', 'Mframes0_EPI16', 'Mframes0_EPI17',

# 'Mframes0_EPI18', 'Mframes0_EPI19', 'Mframes0_EPI20', 'Mframes1_EPI10', 'Mframes3_EPI10',

# 'Mframes4_EPI10', 'Mframes399_EPI96']

可以清楚看到排序后的结果:Mframes0_EPI2.png是排在Mframes0_EPI10.png前面的,排序正确。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值