如何在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
相关产品推荐
相关产品推荐

