构建同名不同扩展名文件的多维列表,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分支有两个核心问题:
file_array.index(file_name)逻辑错误——file_array的元素是子列表(比如['alice_01', ['mov']]),直接传入文件名无法找到对应元素,会触发ValueError。- 即便找到对应子列表,
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
相关产品推荐
相关产品推荐

