带有多个“或”条件的If语句?

2024-05-23 14:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图编写一个程序,在一个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语句有什么问题?你知道吗


Tags: 程序newsizeifstartseqaugrna
2条回答

我认为将检查终止密码子的内部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

这修正了一行。你知道吗

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'):

最后一个想法是,您可以将停止码添加到字典中,并让它们产生一些值,从而触发中断。这将解决@sammason关于散列查找效率的观点,并在主循环中节省一些其他步骤。你知道吗

        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.

相关问题 更多 >