我正在尝试编写一个程序,该程序循环遍历一串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
两种蛋白质均应为“ ME”。我希望它一旦击中三个终止密码子中的任何一个,就会立即停止。我的if语句怎么了?
答案 0 :(得分:1)
这会更正一行。
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'):
答案 1 :(得分:0)
我认为反转内部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: ME