生物信息学:将DNA密码子与字典键匹配并输出匹配的键
修复你的DNA密码子翻译函数
我看了你的代码,发现几个关键问题导致它没法正常工作,咱们一步步来修正:
问题1:字典定义错误
你现在的dna_codons字典里,每个键对应的值直接把字符串连写,Python会自动把它们拼接成一个长字符串(比如'ATT' 'ATC' 'ATA'会变成'ATTATCATA'),这根本没法匹配单个密码子。正确的做法是把每个氨基酸对应的密码子放到列表或元组里。
问题2:匹配逻辑搞反了
你现在是判断密码子是否等于字典的键(比如codon == slc),但实际上应该判断密码子是否属于该键对应的密码子集合,然后返回对应的氨基酸键。
问题3:Python版本兼容与输出逻辑
- 如果用Python 3,
raw_input要改成input,print需要加括号 - 你的函数现在直接print结果,最后调用时又
print(translate(...)),会导致输出重复还带None,应该让函数返回拼接好的结果字符串。
修正后的完整代码
dna_codons = { 'I': ['ATT', 'ATC', 'ATA'], 'L': ['CTT', 'CTC', 'CTA', 'CTG', 'TTA', 'TTG'], 'V': ['GTT', 'GTC', 'GTA', 'GTG'], 'F': ['TTT', 'TTC'], 'M': ['ATG'], } def translate(sequence): n = 3 # 按每3个字符拆分序列,过滤掉长度不足3的无效片段 codon_list = [sequence[i:i+n] for i in range(0, len(sequence), n) if len(sequence[i:i+n]) == 3] result = [] for codon in codon_list: # 遍历字典,找到密码子对应的氨基酸 for amino_acid, codons in dna_codons.items(): if codon in codons: result.append(amino_acid) break # 找到匹配就跳出循环,不用继续找 # 把结果列表拼接成字符串返回 return ''.join(result) # 接收用户输入并输出结果 user_sequence = input('Type in DNA sequence: ') print(translate(user_sequence))
测试你的示例输入
输入:ATTGHIATGTTTTTCTYU
拆分后有效密码子:ATT, ATG, TTT, TTC(GHI和TYU不在字典里,会被忽略)
输出:IMFF,和你想要的结果完全一致。
额外优化建议
为了提高匹配速度,可以把字典反过来,让密码子作为键,氨基酸作为值,这样不用每次遍历整个字典:
# 反向字典:密码子 -> 氨基酸 codon_to_amino = { 'ATT': 'I', 'ATC': 'I', 'ATA': 'I', 'CTT': 'L', 'CTC': 'L', 'CTA': 'L', 'CTG': 'L', 'TTA': 'L', 'TTG': 'L', 'GTT': 'V', 'GTC': 'V', 'GTA': 'V', 'GTG': 'V', 'TTT': 'F', 'TTC': 'F', 'ATG': 'M', } def translate(sequence): n = 3 codon_list = [sequence[i:i+n] for i in range(0, len(sequence), n) if len(sequence[i:i+n]) == 3] # 用列表推导式快速生成结果,只保留能匹配的密码子 return ''.join([codon_to_amino[codon] for codon in codon_list if codon in codon_to_amino])
这个版本的匹配效率更高,代码也更简洁。
内容的提问来源于stack exchange,提问作者Zee Dhlomo




