Rosalind RNA Splicing练习题Python代码无输出故障排查求助
解决Rosalind RNA Splicing代码无输出的问题
嘿,我看了你写的Rosalind RNA Splicing的代码,知道你遇到了代码没报错但没输出的问题,这大概率是输入解析出错导致的——你的代码把FASTA格式的输入当成了空格分隔的文本处理,完全搞错了序列的读取方式,咱们一步步来修正:
问题根源
你的输入文件是标准的FASTA格式,每个序列前面都有带>的标题行,序列本身可能跨多行。但你用了s.split()把整个文件内容拆成了单词列表,这会把标题行(比如>Rosalind_3363)当成第一个元素,后续的序列片段被拆成零散的元素,导致:
- 你认为的
dna其实是>Rosalind_3363,根本不是有效的DNA序列 - 后续的introns也混入了标题行和破碎的序列片段,替换操作后得到的DNA要么是空,要么没有起始密码子
ATG,自然翻译不出蛋白质,返回空字符串,所以没有输出
修正方案
我们需要先正确解析FASTA文件,把第一个完整的序列作为目标DNA,剩下的序列作为introns,然后再执行剪接和翻译操作。下面是修正后的完整代码:
DNA_CODON_TABLE = { 'TTT': 'F', 'CTT': 'L', 'ATT': 'I', 'GTT': 'V', 'TTC': 'F', 'CTC': 'L', 'ATC': 'I', 'GTC': 'V', 'TTA': 'L', 'CTA': 'L', 'ATA': 'I', 'GTA': 'V', 'TTG': 'L', 'CTG': 'L', 'ATG': 'M', 'GTG': 'V', 'TCT': 'S', 'CCT': 'P', 'ACT': 'T', 'GCT': 'A', 'TCC': 'S', 'CCC': 'P', 'ACC': 'T', 'GCC': 'A', 'TCA': 'S', 'CCA': 'P', 'ACA': 'T', 'GCA': 'A', 'TCG': 'S', 'CCG': 'P', 'ACG': 'T', 'GCG': 'A', 'TAT': 'Y', 'CAT': 'H', 'AAT': 'N', 'GAT': 'D', 'TAC': 'Y', 'CAC': 'H', 'AAC': 'N', 'GAC': 'D', 'TAA': '-', 'CAA': 'Q', 'AAA': 'K', 'GAA': 'E', 'TAG': '-', 'CAG': 'Q', 'AAG': 'K', 'GAG': 'E', 'TGT': 'C', 'CGT': 'R', 'AGT': 'S', 'GGT': 'G', 'TGC': 'C', 'CGC': 'R', 'AGC': 'S', 'GGC': 'G', 'TGA': '-', 'CGA': 'R', 'AGA': 'R', 'GGA': 'G', 'TGG': 'W', 'CGG': 'R', 'AGG': 'R', 'GGG': 'G' } def splice_and_translate(dna, introns): # 移除所有内含子 for intron in introns: dna = dna.replace(intron, '') # 翻译为蛋白质 protein = [] for i in range(0, len(dna), 3): codon = dna[i:i+3] if len(codon) <3: break # 忽略不完整的密码子 aa = DNA_CODON_TABLE[codon] if aa == '-': break # 遇到终止密码子停止 protein.append(aa) return ''.join(protein) if __name__ == "__main__": # 正确解析FASTA文件 dna_sequence = '' intron_list = [] current_seq = '' with open('rosalind_splc.txt', 'r') as f: for line in f: line = line.strip() if not line: continue if line.startswith('>'): # 遇到新的标题行,保存之前的序列 if current_seq: if not dna_sequence: dna_sequence = current_seq else: intron_list.append(current_seq) current_seq = '' else: current_seq += line # 处理最后一个序列 if current_seq: if not dna_sequence: dna_sequence = current_seq else: intron_list.append(current_seq) # 执行剪接和翻译并输出结果 print(splice_and_translate(dna_sequence, intron_list))
关键修改点说明
- FASTA解析逻辑:遍历每一行,跳过空行和标题行,把连续的序列片段拼接成完整的序列,第一个序列作为目标DNA,其余作为内含子
- 函数拆分:把原来的
result函数拆成更清晰的splice_and_translate,直接接收已解析好的DNA和内含子列表,避免解析和业务逻辑混在一起 - 边界处理:增加了对不完整密码子的判断,防止最后一段不足3个碱基时出错
现在运行这个代码,应该就能得到正确的蛋白质序列输出了。
内容的提问来源于stack exchange,提问作者programmer211216
相关产品推荐
相关产品推荐

