Python:如何实现路径列表按两级数字字段进行数值排序?
问题:路径列表按指定部分数值排序
我有如下路径列表:
path_list = ['abcdef\\02\\01.jpg', 'abcdef\\02\\10.jpg', 'abcdef\\02\\11.jpg', 'abcdef\\02\\02.jpg', 'abcdef\\02\\03.jpg', 'abcdef\\04\\01.jpg', ...]
希望先按路径中类似02的二级目录部分排序,再按类似01的文件名前缀部分排序(均按数值大小排序)。
我尝试了以下代码:
list = ['abcdef\\02\\01.jpg', 'abcdef\\02\\10.jpg', 'abcdef\\02\\11.jpg', 'abcdef\\02\\02.jpg', 'abcdef\\02\\03.jpg', 'abcdef\\04\\01.jpg', ...] def myFunc(e): print(e) a = e.split('\\')[-2] b = e.split('\\')[-1][0:-4] return int(a+b) list.sort(key=myFunc)
运行后得到的结果不符合预期:
list = ['abcdef\\02\\1.jpg', ... , 'abcdef\\02\\9.jpg', 'abcdef\\04\\1.jpg', ... , 'abcdef\\04\\9.jpg', 'abcdef\\02\\10.jpg']
正确的期望输出应该是:
list = ['abcdef\\02\\1.jpg', ... , 'abcdef\\02\\9.jpg', 'abcdef\\02\\10.jpg', ... , 'abcdef\\02\\17.jpg', 'abcdef\\03\\1.jpg']
当前代码的问题出在哪?怎么实现正确的数值排序?
解决方案
你的问题出在排序键的构造逻辑上:把目录号和文件号拼接成单个整数返回,会导致02+10变成210,04+01变成401,由于401 < 210,04目录的文件会排在02目录的10号文件前面,完全违背了「先按目录排序,再按文件排序」的需求。
正确的做法是返回元组作为排序键:Python中排序元组时,会先比较第一个元素,第一个元素相等再比较第二个元素,完美匹配你的排序规则。
修改后的代码如下:
# 避免用list作为变量名,覆盖Python内置类型 path_list = ['abcdef\\02\\01.jpg', 'abcdef\\02\\10.jpg', 'abcdef\\02\\11.jpg', 'abcdef\\02\\02.jpg', 'abcdef\\02\\03.jpg', 'abcdef\\04\\01.jpg'] def sort_key(path): parts = path.split('\\') # 把目录部分转成整数 dir_num = int(parts[-2]) # 分割文件名和后缀,取前缀转成整数(比固定截取-4更通用) file_num = int(parts[-1].split('.')[0]) # 返回元组,先按目录号排序,再按文件号排序 return (dir_num, file_num) path_list.sort(key=sort_key)
运行后就能得到你期望的结果:
- 同一目录下的文件按文件名前缀的数值从小到大排列(1→9→10→11...)
- 不同目录按目录号的数值从小到大排列(02→03→04...)
内容的提问来源于stack exchange,提问作者Gren Man
相关产品推荐
相关产品推荐

