RNA到蛋白质程序问题



我对我的代码有一些问题,我感谢您的帮助。

程序的第一部分旨在验证用户的输入;因此,除了u g c t(或较低的情况)外,他们不能输入其他任何东西。但是,如果我确实输入其他任何内容,我会收到一条很长的错误消息,但是我想要的只是重新启动功能验证检查()的程序。

另外,如果用户确实输入了有效的序列,则由于某种原因,我的代码没有将有效的RNA序列转换为蛋白质序列。我认为也许这与将Input_RNA中的str分为3个字母的块函数有关。

import re
input_rna = input("Type RNA sequence: ")
def chunks(l, n):
    for i in range(0, len(l), n):
        yield l[i:i+n]
def translate():
    amino_acids = {"UUU":"F", "UUC":"F", "UUA":"L", "UUG":"L",
        "UCU":"S", "UCC":"s", "UCA":"S", "UCG":"S",
        "UAU":"Y", "UAC":"Y", "UAA":"STOP", "UAG":"STOP",
        "UGU":"C", "UGC":"C", "UGA":"STOP", "UGG":"W",
        "CUU":"L", "CUC":"L", "CUA":"L", "CUG":"L",
        "CCU":"P", "CCC":"P", "CCA":"P", "CCG":"P",
        "CAU":"H", "CAC":"H", "CAA":"Q", "CAG":"Q",
        "CGU":"R", "CGC":"R", "CGA":"R", "CGG":"R",
        "AUU":"I", "AUC":"I", "AUA":"I", "AUG":"M",
        "ACU":"T", "ACC":"T", "ACA":"T", "ACG":"T",
        "AAU":"N", "AAC":"N", "AAA":"K", "AAG":"K",
        "AGU":"S", "AGC":"S", "AGA":"R", "AGG":"R",
        "GUU":"V", "GUC":"V", "GUA":"V", "GUG":"V",
        "GCU":"A", "GCC":"A", "GCA":"A", "GCG":"A",
        "GAU":"D", "GAC":"D", "GAA":"E", "GAG":"E",
        "GGU":"G", "GGC":"G", "GGA":"G", "GGG":"G",}
    translated = "".join(amino_acids[i] for i in chunks("".join(input_rna), 3))
def validation_check():
    global input_rna
    if re.match(r"[A, U, G, C, T, a, u, g, c, t]", input_rna):
        print("Correct! That is a valid sequence.")
        translate()
    else:
        print("That is not a valid RNA sequence, please try again.")
        validation_check()
validation_check()

除了指出其他问题之外,您的validation_check函数不允许用户再次输入字符串。这意味着您将继续尝试一遍又一遍地对其进行验证。

您可能想做的更像是:

def validation_check():
    input_rna = raw_input("Type RNA sequence: ").upper()
    if re.match(r"^[AUGCT]+$", input_rna):
        print("Correct! That is a valid sequence.")
        print translate(input_rna)
    else:
        print("That is not a valid RNA sequence, please try again.")
        validation_check()

这避免使用全局,允许用户重新输入,并且不会自动引起无限循环。

(即使这样,在这里使用递归也可能很不好,因此您应该考虑将其实现为while循环。)

您会注意到其他几件事:

  • raw_input而不是input,因为后者具有隐式eval。除非您绝对需要它,否则您想避开这一点。
  • .upper()因此,您具有标准化的字符串以验证和关键。由于您的基础字典仅使用大写字符串,因此这比在其他地方推荐的re.I更有意义。
  • 我让translate返回翻译的蛋白质,然后将其打印。您可能想做其他事情。

我还向您的字典查找添加了一个默认值:

translated = "".join(amino_acids.get(i, '!') for i in chunks("".join(rna), 3)) 

这样,如果您得到一些怪异的东西,您可以尝试继续处理,而不必处理KeyError(如果用户输入一个您没有键的序列,例如'CUT',则会提高该处理)

我还注意到您允许但不要翻译基础'T'。您可能想研究一下。

无论如何,我结束的完整代码是:

import re
def chunks(l, n): 
    for i in range(0, len(l), n): 
        # print i
        chunk = l[i:i+n]
        # print chunk
        yield l[i:i+n]
def translate(rna):
    amino_acids = {"UUU":"F", "UUC":"F", "UUA":"L", "UUG":"L",
        "UCU":"S", "UCC":"s", "UCA":"S", "UCG":"S",
        "UAU":"Y", "UAC":"Y", "UAA":"STOP", "UAG":"STOP",
        "UGU":"C", "UGC":"C", "UGA":"STOP", "UGG":"W",
        "CUU":"L", "CUC":"L", "CUA":"L", "CUG":"L",
        "CCU":"P", "CCC":"P", "CCA":"P", "CCG":"P",
        "CAU":"H", "CAC":"H", "CAA":"Q", "CAG":"Q",
        "CGU":"R", "CGC":"R", "CGA":"R", "CGG":"R",
        "AUU":"I", "AUC":"I", "AUA":"I", "AUG":"M",
        "ACU":"T", "ACC":"T", "ACA":"T", "ACG":"T",
        "AAU":"N", "AAC":"N", "AAA":"K", "AAG":"K",
        "AGU":"S", "AGC":"S", "AGA":"R", "AGG":"R",
        "GUU":"V", "GUC":"V", "GUA":"V", "GUG":"V",
        "GCU":"A", "GCC":"A", "GCA":"A", "GCG":"A",
        "GAU":"D", "GAC":"D", "GAA":"E", "GAG":"E",
        "GGU":"G", "GGC":"G", "GGA":"G", "GGG":"G",}
    translated = "".join(amino_acids.get(i, '!') for i in chunks("".join(rna), 3)) 
    return translated
def validation_check():
    input_rna = raw_input("Type RNA sequence: ").upper()
    if re.match(r"^[AUGCT]+$", input_rna):
        print("Correct! That is a valid sequence.")
        print translate(input_rna)
    else:
        print("That is not a valid RNA sequence, please try again.")
        validation_check()
# in case you ever need to import this, don't always call validation_check
if __name__ == "__main__":
     validation_check()

正则表达式是错误的,请尝试:

if re.match(r"^[AUGCT]+$", input_rna, re.IGNORECASE):

以下是更好的,因为在RNA中,尿嘧啶而不是甲胺...

if re.match(r"^[AUGC]+$", input_rna, re.IGNORECASE):

注意:算法翻译有问题,也

list(chunks("".join(input_rna), 3))

您得到:

['ACG', 'AUG', 'AGU', 'CAU', 'GCU', 'U']

最后的问题是" acgaugucuaugaugcuu",如果不长度为3

的多个长度

解决方案:

"".join(amino_acids[i] for i in chunks("".join(input_rna), 3) if len(i)==3)

最新更新