首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有多个"or“条件的If语句?

带有多个"or“条件的If语句?
EN

Stack Overflow用户
提问于 2019-07-25 06:54:05
回答 2查看 158关注 0票数 1

我正在尝试写一个程序,它循环通过一串RNA碱基,找到起始密码子('AUG'),将下面的密码子分组为三个(即‘UAA’,'ACC'),从字典中查找相应的氨基酸,创建一个包含结果氨基酸的字符串,然后继续,直到它到达一个终止密码子('UAA','UGA','UAG')。RNA以三个为一组,从起始密码子开始,以终止密码子结束。

问题是,当我想让程序检查它是否命中了三个停止密码子中的一个时,如果我在同一个if语句中列出了所有三个停止密码子中的一个,它就不能工作。当检查字典时,它会将终止密码子视为未知的(.get(codon, 'X')),并在蛋白质中将其列为'X‘:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
AUG
GAA
UAA
ACC
MEXT

如果我只列出了一个终止密码子,那么它是有效的:

代码语言:javascript
复制
if codon != 'UAA':
代码语言:javascript
复制
AUG
GAA
UAA
ME

这两种蛋白质都应该是'ME‘。我希望它在命中三个停止密码子中的任何一个时立即停止。我的if语句有什么问题?

EN

回答 2

Stack Overflow用户

发布于 2019-07-25 07:00:26

这会更正一行。

代码语言:javascript
复制
if codon != 'UAA' and codon != 'UGA' and codon != 'UAG':

如果你说不等于x或不等于y,它总是正确的。简化一点

代码语言:javascript
复制
if x != 1 or x !=2:

无论x是什么,这句话都是正确的。不是每个数字都等于1和2,包括1和2。

但编写这行代码的最清晰方法是。

代码语言:javascript
复制
if codon not in ('UAA', 'UGA', 'UAG'):

最后一个想法是,您可以将停止代码添加到您的字典中,并使它们产生一些值,在此基础上触发中断。这将解决@Sam Mason关于散列查找效率的观点,以及节省主循环中的一些其他步骤。

代码语言:javascript
复制
        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循环。

代码语言:javascript
复制
from textwrap import wrap
...
...
         for codon in wrap(new_seq, 3):
             print(codon)
             etc.
票数 1
EN

Stack Overflow用户

发布于 2019-07-25 07:42:00

我认为反转内部if检查停止码的逻辑会更具可读性:

代码语言:javascript
复制
if codon == 'UAA' or codon == 'UGA' or codon == 'UAG':

然而,通过将所有可能性存储在set中来进行等效操作会更有效率,这将使成员检查变得更简单、更快。

这就是我的意思(请注意,我还从循环中删除了常量的创建):

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
AUG
GAA
UGA
protein: ME
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57192239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档