You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 同一目录下的文件按文件名前缀的数值从小到大排列(1→9→10→11...)
  2. 不同目录按目录号的数值从小到大排列(02→03→04...)

内容的提问来源于stack exchange,提问作者Gren Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:45:36