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

构建同名不同扩展名文件的多维列表,else分支逻辑出错求解决

问题描述

我有一个目录,文件命名模式如下:

alice_01.mov
alice_01.mp4
alice_02.mp4
bob_01.avi

我的目标是遍历指定路径下的所有文件,整理成一个多维列表,每个子列表包含**唯一的文件名(不含扩展名)**和对应的扩展名列表,格式如下:

resulting_list = [
    ['alice_01', ['mov','mp4']],
    ['alice_02', ['mp4']],
    ['bob_01', ['avi']]
]

我写了如下代码,但else分支逻辑始终不对,无法正确添加扩展名:

import os

path = "user_files/"

def user_files(path):
    files = []
    for file in os.listdir(path):
        files.append(file)
    return files

file_array = []
for file in user_files(path):
    file_name = file.split(".")[0]
    file_ext = file.split(".")[1]
    if file_name not in (sublist[0] for sublist in file_array):
        file_array.append([file_name,[file_ext]])
    else:
        file_array[file_array.index(file_name)].append([file_name,[file_ext]])

print(file_array)
问题分析与修正

你的else分支有两个核心问题:

  1. file_array.index(file_name)逻辑错误——file_array的元素是子列表(比如['alice_01', ['mov']]),直接传入文件名无法找到对应元素,会触发ValueError。
  2. 即便找到对应子列表,append([file_name,[file_ext]])会新增一个子列表,而非把扩展名添加到已有的扩展名列表中。

修正后的代码

import os

path = "user_files/"

def user_files(path):
    return os.listdir(path)  # 简化函数,无需循环追加

file_array = []
for file in user_files(path):
    # 用rsplit避免文件名含多个点的情况,确保只拆分最后一个点
    file_name, file_ext = file.rsplit(".", 1)
    # 检查当前文件名是否已存在
    found = False
    for item in file_array:
        if item[0] == file_name:
            item[1].append(file_ext)
            found = True
            break
    if not found:
        file_array.append([file_name, [file_ext]])

print(file_array)

优化方案:用字典提升效率

列表遍历查找的效率偏低,尤其是文件数量较多时,推荐先用字典分组,再转成目标格式:

import os

path = "user_files/"

ext_map = {}
for file in os.listdir(path):
    if "." not in file:  # 跳过无扩展名的文件
        continue
    file_name, file_ext = file.rsplit(".", 1)
    # 字典键为文件名,值为扩展名列表
    if file_name in ext_map:
        ext_map[file_name].append(file_ext)
    else:
        ext_map[file_name] = [file_ext]

# 将字典转换为目标多维列表
file_array = [[name, exts] for name, exts in ext_map.items()]
print(file_array)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:25:22