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

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. 优先区分是否含数字:用-1标记含数字的目录(排序时会排在0标记的无数字目录前面)
  2. 其次按大小降序:对大小取负数,利用Python默认升序特性实现降序
  3. 最后按目录名中的数字排序:保证同大小的含数字目录按编号顺序排列

修正后的代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:45:38