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

如何在Python中匹配样本名与文件名并生成多值字典?

问题描述

我有一个样本名列表和一个包含样本名的文件名列表:

sample_names = ['SampleA', 'SampleB', 'SampleC']
file_names = ['/path/to/group1/bin_1/group_1_bin_1_SampleA.tsv', 
              '/path/to/group1/bin_1/group_1_bin_1_SampleB.tsv',
              '/path/to/group1/bin_1/group_1_bin_1_SampleC.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleA.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleB.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleC.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleA.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleB.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleC.tsv']

需要将每个样本名与对应的所有文件名匹配,生成如下格式的多值字典:

dictionary = {'SampleA': ['/path/to/group1/bin_1/group_1_bin_1_SampleA.tsv',
                          '/path/to/group1/bin_2/group_1_bin_2_SampleA.tsv',
                          '/path/to/group1/bin_3/group_1_bin_3_SampleA.tsv'],
              'SampleB': ['/path/to/group1/bin_1/group_1_bin_1_SampleB.tsv',
                          '/path/to/group1/bin_2/group_1_bin_2_SampleB.tsv',
                          '/path/to/group1/bin_3/group_1_bin_3_SampleB.tsv'],
              'SampleC': ['/path/to/group1/bin_1/group_1_bin_1_SampleC.tsv',
                          '/path/to/group1/bin_2/group_1_bin_2_SampleC.tsv',
                          '/path/to/group1/bin_3/group_1_bin_3_SampleC.tsv']}

方案一:基础循环实现

先初始化每个样本名对应的空列表,再遍历所有文件名,判断当前文件名属于哪个样本后添加到对应列表:

sample_names = ['SampleA', 'SampleB', 'SampleC']
file_names = ['/path/to/group1/bin_1/group_1_bin_1_SampleA.tsv', 
              '/path/to/group1/bin_1/group_1_bin_1_SampleB.tsv',
              '/path/to/group1/bin_1/group_1_bin_1_SampleC.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleA.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleB.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleC.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleA.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleB.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleC.tsv']

# 初始化字典,每个样本对应空列表
result = {sample: [] for sample in sample_names}

for file in file_names:
    for sample in sample_names:
        if sample in file:
            result[sample].append(file)
            break  # 找到匹配样本后跳出内层循环,提升效率

print(result)

方案二:精准匹配文件名(避免路径干扰)

如果担心样本名出现在路径目录中导致误匹配,可提取文件名后再判断:

import os

sample_names = ['SampleA', 'SampleB', 'SampleC']
file_names = ['/path/to/group1/bin_1/group_1_bin_1_SampleA.tsv', 
              '/path/to/group1/bin_1/group_1_bin_1_SampleB.tsv',
              '/path/to/group1/bin_1/group_1_bin_1_SampleC.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleA.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleB.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleC.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleA.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleB.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleC.tsv']

result = {sample: [] for sample in sample_names}

for file in file_names:
    filename = os.path.basename(file)
    for sample in sample_names:
        if sample in filename:
            result[sample].append(file)
            break

print(result)

方案三:使用collections.defaultdict简化初始化

无需手动为每个样本创建空列表,defaultdict会自动处理列表初始化:

from collections import defaultdict

sample_names = ['SampleA', 'SampleB', 'SampleC']
file_names = ['/path/to/group1/bin_1/group_1_bin_1_SampleA.tsv', 
              '/path/to/group1/bin_1/group_1_bin_1_SampleB.tsv',
              '/path/to/group1/bin_1/group_1_bin_1_SampleC.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleA.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleB.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleC.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleA.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleB.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleC.tsv']

result = defaultdict(list)

for file in file_names:
    for sample in sample_names:
        if sample in file:
            result[sample].append(file)
            break

# 若需要转为普通字典,执行:result = dict(result)
print(result)

方案四:字典推导式精简代码

用字典推导式结合列表推导式,一行代码完成逻辑:

sample_names = ['SampleA', 'SampleB', 'SampleC']
file_names = ['/path/to/group1/bin_1/group_1_bin_1_SampleA.tsv', 
              '/path/to/group1/bin_1/group_1_bin_1_SampleB.tsv',
              '/path/to/group1/bin_1/group_1_bin_1_SampleC.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleA.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleB.tsv',
              '/path/to/group1/bin_2/group_1_bin_2_SampleC.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleA.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleB.tsv',
              '/path/to/group1/bin_3/group_1_bin_3_SampleC.tsv']

result = {sample: [file for file in file_names if sample in file] for sample in sample_names}

print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:10:11