我正在尝试写一个程序,它循环通过一串RNA碱基,找到起始密码子('AUG'),将下面的密码子分组为三个(即‘UAA’,'ACC'),从字典中查找相应的氨基酸,创建一个包含结果氨基酸的字符串,然后继续,直到它到达一个终止密码子('UAA','UGA','UAG')。RNA以三个为一组,从起始密码子开始,以终止密码子结束。
问题是,当我想让程序检查它是否命中了三个停止密码子中的一个时,如果我在同一个if语句中列出了所有三个停止密码子中的一个,它就不能工作。当检查字典时,它会将终止密码子视为未知的(.get(codon, 'X')),并在蛋白质中将其列为'X‘:
a_seq = 'AAAAUGGAAUGAACC'
kmer_size = 3
for start in range (0,len(a_seq)- kmer_size+1,1):
kmer = a_seq[start:start+kmer_size]
if kmer == 'AUG':
start_codon = a_seq.index(kmer)
new_seq = a_seq[start_codon:]
last_codon_start = len(new_seq) - 2
dictionary = {'AUG':'M',
'GAA':'E',
'ACC':'T'}
protein = ''
for start in range(0, last_codon_start, 3):
codon = new_seq[start:start+3]
print(codon)
if codon != 'UAA' or codon != 'UGA' or codon != 'UAG':
amino_acid = dictionary.get(codon,'X')
protein += amino_acid
else:
break
print(protein)
break输出:
AUG
GAA
UAA
ACC
MEXT如果我只列出了一个终止密码子,那么它是有效的:
if codon != 'UAA':AUG
GAA
UAA
ME这两种蛋白质都应该是'ME‘。我希望它在命中三个停止密码子中的任何一个时立即停止。我的if语句有什么问题?
发布于 2019-07-25 07:00:26
这会更正一行。
if codon != 'UAA' and codon != 'UGA' and codon != 'UAG':如果你说不等于x或不等于y,它总是正确的。简化一点
if x != 1 or x !=2:无论x是什么,这句话都是正确的。不是每个数字都等于1和2,包括1和2。
但编写这行代码的最清晰方法是。
if codon not in ('UAA', 'UGA', 'UAG'):最后一个想法是,您可以将停止代码添加到您的字典中,并使它们产生一些值,在此基础上触发中断。这将解决@Sam Mason关于散列查找效率的观点,以及节省主循环中的一些其他步骤。
dictionary = {'AUG': 'M',
'GAA': 'E',
'ACC': 'T',
'UUA': '*',
'UGA': '*',
'UAG': '*',
}
protein = ''
for start in range(0, last_codon_start, 3):
codon = new_seq[start:start+3]
print(codon)
amino_acid = dictionary.get(codon,'X')
if amino_acid == '*':
break
protein += amino_acid最后的想法。使用textwrap模块(标准Python)可以稍微简化for循环。
from textwrap import wrap
...
...
for codon in wrap(new_seq, 3):
print(codon)
etc.发布于 2019-07-25 07:42:00
我认为反转内部if检查停止码的逻辑会更具可读性:
if codon == 'UAA' or codon == 'UGA' or codon == 'UAG':然而,通过将所有可能性存储在set中来进行等效操作会更有效率,这将使成员检查变得更简单、更快。
这就是我的意思(请注意,我还从循环中删除了常量的创建):
START_CODONS = {'AUG': 'M',
'GAA': 'E',
'ACC': 'T'}
STOP_CODONS = {'UAA', 'UGA', 'UAG'}
a_seq = 'AAAAUGGAAUGAACC'
kmer_size = 3
for start in range (0, len(a_seq)-kmer_size+1, 1):
kmer = a_seq[start: start+kmer_size]
if kmer == 'AUG':
start_codon = a_seq.index(kmer)
new_seq = a_seq[start_codon:]
last_codon_start = len(new_seq) - 2
protein = ''
for start in range(0, last_codon_start, 3):
codon = new_seq[start: start+3]
print(codon)
# if codon == 'UAA' or codon == 'UGA' or codon == 'UAG':
if codon in STOP_CODONS:
break
else:
amino_acid = START_CODONS.get(codon, 'X')
protein += amino_acid
print('protein:', protein)
break输出:
AUG
GAA
UGA
protein: MEhttps://stackoverflow.com/questions/57192239
复制相似问题