如何将匹配同一键的所有值归集到单个键下?Python实现方案求助
解决文件名按前缀分组的问题
我来帮你梳理下代码里的问题,然后给出能得到预期结果的方案。
你的代码存在的几个问题:
- 前缀提取写法不清晰且有风险:
i.split("_", 1)[-2]虽然能拿到前缀,但逻辑很绕——split("_",1)会把文件名分成两部分,[-2]取的是第一部分,不如直接用[0]直观,要是文件名格式变化(比如开头就有下划线),这种写法会出错。 - 错误赋值整个列表:第二个循环里
dict[i] = list_dir,这会把全部文件名赋值给每个键,而不是只收集当前前缀对应的文件,这是最核心的问题。 - 双重循环效率低:每个前缀都要遍历整个文件名列表,既冗余又容易导致重复赋值。
正确的实现方式
方法1:基础字典写法
这种写法不需要额外导入模块,逻辑清晰易懂:
list_dir = ['192586_Sample_010_Test.pdf', '192586_Sample_020_Test.pdf', '192586_Sample_050_Test.pdf', '192120_Sample_020_Test.pdf', '192120_Sample_050_Test.pdf', '192163_Sample_010_Test.pdf', '192163_Sample_020_Test.pdf', '192145_Sample_010_Test.pdf', '192145_Sample_020_Test.pdf', '192145_Sample_050_Test.pdf', '192051_Sample_010_Test.pdf', '192051_Sample_020_Test.pdf', '192051_Sample_050_Test.pdf'] # 不要用dict作为变量名,这是Python内置类型,会覆盖内置函数 file_group = {} for filename in list_dir: # 提取第一个下划线前的内容作为分组键 prefix = filename.split("_")[0] # 如果键不存在,先初始化一个空列表 if prefix not in file_group: file_group[prefix] = [] # 将当前文件名添加到对应分组的列表中 file_group[prefix].append(filename) print(file_group)
方法2:用collections.defaultdict简化代码
如果想让代码更简洁,可以用Python标准库的defaultdict,它会自动为不存在的键创建空列表:
from collections import defaultdict list_dir = ['192586_Sample_010_Test.pdf', '192586_Sample_020_Test.pdf', '192586_Sample_050_Test.pdf', '192120_Sample_020_Test.pdf', '192120_Sample_050_Test.pdf', '192163_Sample_010_Test.pdf', '192163_Sample_020_Test.pdf', '192145_Sample_010_Test.pdf', '192145_Sample_020_Test.pdf', '192145_Sample_050_Test.pdf', '192051_Sample_010_Test.pdf', '192051_Sample_020_Test.pdf', '192051_Sample_050_Test.pdf'] file_group = defaultdict(list) for filename in list_dir: prefix = filename.split("_")[0] file_group[prefix].append(filename) # 可选:如果需要转换成普通字典 file_group = dict(file_group) print(file_group)
这两种方法都会输出你期望的结果:
{'192586': ['192586_Sample_010_Test.pdf', '192586_Sample_020_Test.pdf', '192586_Sample_050_Test.pdf'], '192120': ['192120_Sample_020_Test.pdf', '192120_Sample_050_Test.pdf'], '192163': ['192163_Sample_010_Test.pdf', '192163_Sample_020_Test.pdf'], '192145': ['192145_Sample_010_Test.pdf', '192145_Sample_020_Test.pdf', '192145_Sample_050_Test.pdf'], '192051': ['192051_Sample_010_Test.pdf', '192051_Sample_020_Test.pdf', '192051_Sample_050_Test.pdf']}
内容的提问来源于stack exchange,提问作者Ominpathy
相关产品推荐
相关产品推荐

