我正试图编写一个程序,在一个RNA碱基串中循环,找到起始密码子('AUG'),将下面的密码子分成三个(即'GAA','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
两种蛋白质都应该是“我”。我希望它一碰到三个密码子中的任何一个就会停止。我的if语句有什么问题?你知道吗
我认为将检查终止密码子的内部
if
逻辑颠倒会更具可读性:但是将所有可能的结果存储在
set
中,这样做会更有效,从而使成员身份检查更简单和更快。你知道吗我的意思是(注意,我还把常量的创建从循环中去掉了):
输出:
这修正了一行。你知道吗
如果你说不等于x或不等于y,它总是正确的。简化一点
不管x是什么,这句话都是真的。每个数都不等于1和2,包括1和2。你知道吗
但编写这行代码最清晰的方法是。你知道吗
最后一个想法是,您可以将停止码添加到字典中,并让它们产生一些值,从而触发中断。这将解决@sammason关于散列查找效率的观点,并在主循环中节省一些其他步骤。你知道吗
最后的想法。使用textwrap模块(标准Python)可以稍微简化for循环。你知道吗
相关问题 更多 >
编程相关推荐