python - Python for循环过早停止
问题描述
我正在尝试将 DNA 序列转换为氨基酸序列。我有一本密码子字典:
codon_mapping = {'AAA': 'K','AAC': 'N','AAG': 'K','AAT': 'N','ACA': 'T','ACC': 'T','ACG': 'T','ACT': 'T','AGA': 'R','AGC': 'S','AGG': 'R','AGT': 'S','ATA': 'I','ATC': 'I','ATG': 'M','ATT': 'I','CAA': 'Q','CAC': 'H','CAG': 'Q','CAT': 'H','CCA': 'P','CCC': 'P','CCG': 'P','CCT': 'P','CGA': 'R','CGC': 'R','CGG': 'R','CGT': 'R','CTA': 'L','CTC': 'L','CTG': 'L','CTT': 'L','GAA': 'E','GAC': 'D','GAG': 'E','GAT': 'D','GCA': 'A','GCC': 'A','GCG': 'A','GCT': 'A','GGA': 'G','GGC': 'G','GGG': 'G','GGT': 'G','GTA': 'V','GTC': 'V','GTG': 'V','GTT': 'V','TAA': '*','TAC': 'Y','TAG': '*','TAT': 'Y','TCA': 'S','TCC': 'S','TCG': 'S','TCT': 'S','TGA': '*','TGC': 'C','TGG': 'W','TGT': 'C','TTA': 'L','TTC': 'F','TTG': 'L','TTT': 'F'}
和一个输入序列:
seq = 'ATGTATGGCTAGCTTACTACTGCGCACTGATGTGGCTATCGATCGCTGGTCGTTGCTGACCGAGCTAAA'
我目前有这个代码:
#import re
import re
#find the start codons in the sequence
starts=[m.start() for m in re.finditer('ATG', seq)]
#establish new dictionary
seqDictionary={}
#translate sequences
for i in starts:
mySeq=seq[i:]
translated=''
for n in range(0, len(mySeq), 3):
print(mySeq[n:n+3])
if codon_mapping[mySeq[n:n+3]] != '*':
translated += codon_mapping[mySeq[n:n+3]]
if codon_mapping[seq[n:n+3]] == '*':
break
print("translated: " + translated)
seqDictionary[i]=(translated)
print(seqDictionary)
AA_frame1 = seqDictionary[0]
AA_frame2 = seqDictionary[4]
AA_frame3 = seqDictionary[29]
AA_longest = None
问题是对于第二个和第三个序列(分别从位置 4 和 29),for-loop 在第四个氨基酸之后退出,即使这些不是终止密码子。
上述代码的输出是:
ATG
TAT
GGC
TAG
translated: MYG
ATG
GCT
AGC
TTA
translated: MASL
ATG
TGG
CTA
TCG
translated: MWLS
{0: 'MYG', 4: 'MASL', 29: 'MWLS'}
我没有收到任何错误消息,也无法弄清楚循环退出的原因。我知道翻译序列的正确解决方案是:
MYG
MASLLLRTDVAIDRWSLLTEL
MWLSIAGRC
编辑,这个最终代码有效:
#import re
import re
#find the start codons in the sequence
starts=[m.start() for m in re.finditer('ATG', seq)]
#establish new dictionary
seqDictionary={}
#translate sequences
for i in starts:
mySeq=seq[i:]
translated=''
for n in range(0, len(mySeq), 3):
if len(mySeq[n:n+3]) < 3:
break
if codon_mapping[mySeq[n:n+3]] == '*':
break
else:
translated += codon_mapping[mySeq[n:n+3]]
seqDictionary[i]=(translated)
print(seqDictionary)
输出:
{0: 'MYG', 4: 'MASLLLRTDVAIDRWSLLTEL', 29: 'MWLSIAGRC'}
解决方案
if codon_mapping[mySeq[n:n+3]] != '*':
translated += codon_mapping[mySeq[n:n+3]]
if codon_mapping[seq[n:n+3]] == '*':
break
在这里,您不是在检查同一件事。第一个 if 是检查mySeq
,第二个 if 是检查seq
。
这比两个 if 写成 if else 更好
if codon_mapping[mySeq[n:n+3]] == '*':
break
else:
translated += codon_mapping[mySeq[n:n+3]]
推荐阅读
- python - WTForms - 提交后 DateTimeLocalField 数据为无
- python - 从 SHA-1 恢复损坏的 128 位密钥
- r - 按另一列的条件返回列值
- ssh - 如何获取其他ubuntu系统的ssh密码?
- android - 如何运行 VtsHalWifiSupplicantV1_0Target 测试用例
- java - 我应该如何处理公共 int compare() 中的异常?
- javascript - 如何在 onBeforeDrag 时更改图像的边框颜色?
- angular - 无法在 Angularfire2 中处理我想要的文档数据
- oracle-adf - Oracle ADF 总是这么难以部署吗?
- algorithm - 如何一次性选择跳转指令?