如何使用字典与列表按基因键合并多文件输入生成单条输出行
实现代码
基于你已经构建好的字典和实验数据列表,直接运行以下代码即可生成符合要求的合并文件:
# 打开输出文件,写入合并结果 with open("merged_gene_exp.txt", "w") as out_file: # 写入输出表头 out_file.write("Gene.name\tExperiment.1\tExperiment.2\tGene description\tChromosome number\n") # 遍历匹配基因名和对应的实验值 for gene, exp1, exp2 in zip(genes, exp1values, exp2values): # 查询注释信息,不存在则返回N/A gene_desc = gene_annotations.get(gene, {}).get("Gene Description", "N/A") # 查询染色体信息,不存在则返回N/A chrom_num = gene_chroms.get(gene, {}).get("Chromosome Number", "N/A") # 拼接行并写入文件 out_file.write(f"{gene}\t{exp1}\t{exp2}\t{gene_desc}\t{chrom_num}\n")
关键逻辑说明
- 用
zip()函数同步遍历三个实验数据列表,确保基因名和对应的两个实验值一一对应,不会出现匹配错位 - 字典查询时使用两层
get()方法:第一层判断当前基因是否在注释字典中,不存在则返回空字典;第二层查询具体字段值,找不到就返回默认值N/A,可以完全避免键不存在时报错的问题 - 输出默认使用制表符分隔,和你输入文件的格式保持一致,后续可以直接用Excel、记事本等工具打开查看
可选优化(简化字典构建)
你原来的代码需要两次读取注释文件,其实一次读取就可以同时构建两个字典,减少文件IO开销,优化后的构建代码如下:
gene_annotations = {} gene_chroms = {} with open("human_gene_annotations.txt", "rt") as infile: # 跳过表头行 infile.readline() for line in infile: line = line.rstrip() info = line.split("\t") gene_name = info[0] gene_annotations[gene_name] = {"Gene Description": info[1]} gene_chroms[gene_name] = {"Chromosome Number": info[2]}
内容的提问来源于stack exchange,提问作者user8903149
相关产品推荐
相关产品推荐

