RNA to PROTEIN 程序问题
RNA to PROTEIN program questions
我的代码有一些问题,希望得到帮助。
程序的第一部分是为了验证用户的输入;所以他们只能输入 A U G C T(或小写)。但是,如果我确实输入了其他任何内容,我会收到一条很长的错误消息,但我想要的只是程序重新启动功能验证 check()。
此外,如果用户确实输入了有效序列,出于某种原因我的代码没有将有效的 RNA 序列翻译成蛋白质序列。我认为这可能与将 input_rna 中的 str 分成 3 个字母的块的 chunks 函数有关。
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()
正则表达式错误,试试:
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']
最后 "ACGAUGAGUCAUGCUU" 的问题,如果长度不是 3 的倍数
解决方案:
"".join(amino_acids[i] for i in chunks("".join(input_rna), 3) if len(i)==3)
除了指出的其他问题外,您的 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
return 翻译的蛋白质,然后打印出来。你可能想做点别的。
我还为您的字典查找添加了一个默认值:
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()
我的代码有一些问题,希望得到帮助。
程序的第一部分是为了验证用户的输入;所以他们只能输入 A U G C T(或小写)。但是,如果我确实输入了其他任何内容,我会收到一条很长的错误消息,但我想要的只是程序重新启动功能验证 check()。
此外,如果用户确实输入了有效序列,出于某种原因我的代码没有将有效的 RNA 序列翻译成蛋白质序列。我认为这可能与将 input_rna 中的 str 分成 3 个字母的块的 chunks 函数有关。
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()
正则表达式错误,试试:
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']
最后 "ACGAUGAGUCAUGCUU" 的问题,如果长度不是 3 的倍数
解决方案:
"".join(amino_acids[i] for i in chunks("".join(input_rna), 3) if len(i)==3)
除了指出的其他问题外,您的 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
return 翻译的蛋白质,然后打印出来。你可能想做点别的。
我还为您的字典查找添加了一个默认值:
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()