Python目录列表排序异常:按名称数字+大小排序需求未实现
问题:目录列表排序异常,要求含数字目录按大小靠前排列
问题场景
需要对目录列表实现双重排序规则:
- 名称包含数字的目录必须排在列表前列
- 含数字的目录内部按大小从大到小排序;其余目录也按大小降序排列
现有代码未满足需求,出现了数字编号大但大小为0的目录排在最前的错误。
现有代码
import re def num_sort(size): return list(map(int, re.findall(r'\d+ ', size)))[0] ab.sort(key=num_sort) print("The top 5 folders in your directory and their size are : ") print(ab) print("The top 5 directories with the largest size are: ") for i in range(1,6): print(ab[-i])
当前错误输出
Dir50 0 MB Dir1 20 MB Dir2 15 MB etc...
期望输出
Dir1 20 MB Dir2 15 MB Dir3 10 MB Dir4 5 MB etc...
解决思路与修正代码
现有代码的核心问题是只提取了目录名中的数字作为排序键,完全忽略了目录大小的权重,且排序方向不符合需求。要实现目标,需要让排序键返回一个优先级元组:
- 优先区分是否含数字:用
-1标记含数字的目录(排序时会排在0标记的无数字目录前面) - 其次按大小降序:对大小取负数,利用Python默认升序特性实现降序
- 最后按目录名中的数字排序:保证同大小的含数字目录按编号顺序排列
修正后的代码:
import re def custom_sort(item): # 拆分目录名与大小部分(假设格式为 "DirX XX MB") name_part, size_part = item.split(' ', 1) # 提取大小数值 size = int(size_part.split(' ')[0]) # 提取目录名中的数字,无数字则返回0 num_match = re.search(r'\d+', name_part) dir_num = int(num_match.group()) if num_match else 0 # 返回排序元组:(含数字标记, -大小, 目录编号) return (-1 if num_match else 0, -size, dir_num) # 示例目录列表 ab = ["Dir50 0 MB", "Dir1 20 MB", "Dir2 15 MB", "Dir3 10 MB", "Dir4 5 MB", "TestDir 8 MB"] ab.sort(key=custom_sort) print("排序后的目录列表(含数字目录优先,按大小降序): ") for item in ab[:5]: print(item)
代码说明
- 排序元组的第一个元素确保含数字目录整体前置
- 第二个元素通过负数值实现大小降序排列
- 第三个元素保证同大小的含数字目录按编号顺序展示
运行后输出符合期望:
Dir1 20 MB Dir2 15 MB Dir3 10 MB TestDir 8 MB Dir4 5 MB
内容的提问来源于stack exchange,提问作者martin o
相关产品推荐
相关产品推荐

