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()处理排序。所以需要对文件名进行分割后排序



    如上图所示,通过re.split()函数进行多符号分割,将Mframes0_EPI1.png中的Mframes_EPI.png去掉,然后通过sort()函数将留下的数字01取整型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前面的,排序正确。

参考

[1] Python文件名排序或文件排序问题

[2] 文件名(文件夹名) 排序: 按字符串排序、 按数字排序 Python

[3] python对目录下的文件进行 多条件排序

[4] Python之split()函数

[5] 在python 中split()使用多符号分割的例子

码字不易,如果您觉得有帮助,麻烦点个赞再走呗~

python下使用sort()函数对目录下文件名进行多条件排序的更多相关文章

  1. STL下<algorithm>下的sort函数

    定义: sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序.sort函数进行排序的时间复杂度为nlog2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#i ...

  2. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小

    本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏. 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小,类似Windows如下功能: 模块介绍: from ftplib import F ...

  3. Python使用os.listdir()函数来得目录内容的介绍

    Python编程语言是计算机语言中常用的语言,以下的文章就是介绍在Python编程语言中使用os.listdir()函数来获得目录中的相关内容的介绍,如果你对其相关的实际操作有兴趣的话,你就可以观看以 ...

  4. 疑难问题解决备忘录(1)——LAMP环境下WordPress无法发现themes目录下的主题问题解决

    程序猿的宿命就是无穷无尽地解题,虽然可以说是解题的机器,但也无法达到解题之神的境界,碰到自己解决不了的问题那是家常便饭,尤其当遍寻Google和StackOverflow花了九牛二虎之力才解决的问题, ...

  5. linux下实现ls()函数遍历目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...

  6. [C++]linux下实现ls()函数遍历目录

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600794.html 需求:在linux下遍历目录,输出目录中各文件名. 在linux下遍历目录的相关函数有 ...

  7. 用glob()函数返回目录下的子文件以及子目录

    glob() 函数返回匹配指定模式的文件名或目录 相对于readdir()和opendir()来说,使用glob()函数会方便很多 代码1: <?php function getfilename ...

  8. 搬运:Python for Windows——监控Windows某个目录下文件的变化

    https://win32com.goermezer.de/content/view/286/285/ 这个网站真是给力,不多说,代码直接搬运过来,还有我的测试结果,拿走不谢! import os i ...

  9. windows下使用php重命名目录下的文件

    rename函数一直报错,最后发现是windows下文件名的编码问题,如果项目文件是utf-8的话,一定要经过一步转码 $dir = $path . '/../resource/logo'; $han ...

随机推荐

  1. PHP 全局使用 Laravel 辅助函数 dd

    dump() 方法 全局 composer.json 12345 "require": { "squizlabs/php_codesniffer": " ...

  2. Java中间件之RMI及实例介绍 · zijian's blog

    RMI介绍   远程方法调用(Remote Method Invocation)是Sun公司规定的允许在不同的JAVA虚拟机之间进行对象间通信的一种规范.在RMI中,JVM可以位于一个或多个计算机上, ...

  3. 修改android项目sdk版本

    1.右键单击项目--->properties---->Resource----->Android在Project Bulid Target对话框中选择你需要的Android版本.2. ...

  4. css进阶之二:flex弹性布局

    布局模式是指一个盒子与其兄弟.祖先盒的关系决定其尺寸与位置的算法.css2.1中定义了四种布局模式,分别是块布局.行内布局.表格布局.以及定位布局.css3引入了新的布局模式Flexbox布局,灵活度 ...

  5. C++走向远洋——47(第十二周、运算符重载基础程序、阅读)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  6. qt creator源码全方面分析(3)

    目录 项目文件分析 qtcreator.pro 包含qtcreator.pri Qt版本判断 包含doc.pri 源码组织架构 指定dist文件列表 qbs配置 指定架构和平台 指定基础名 指定lin ...

  7. MYSQL对数据库和表的基本操作

    CREATE DATABASE testdb CHARSET=UTF8 创建一个数据库 名字叫做testdb USE testdb; 选择数据库 CREATE TABLE testTable1( ) ...

  8. cocoapods iOS类库管理工具的安装与使用

    CocoaPods是一个管理Swift和Objective-C的Cocoa项目的依赖工具.他可以优雅地帮助你扩展你的项目.简单的说,就是替你管理Swift和Objective-C的Cocoa项目的第三 ...

  9. Flutter Widgets 对话框-Dialog

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 当应用程序进行重要操作时经常需要用户进行2次确认,以避免用 ...

  10. css手写一个表头固定

    Bootstrap,layui等前端框架里面都对表头固定,表格滚动有实现,偏偏刚入职的公司选择了手动渲染表格,后期又觉得表格数据拉太长想要做表头固定.为了避免对代码改动太大,所以决定手写表头固定 主要 ...