如果语句具有多个“或”条件?

时间:2019-07-24 22:54:05

标签: python bioinformatics

我正在尝试编写一个程序,该程序循环遍历一串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语句怎么了?

2 个答案:

答案 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