从蛋白质 Rosalind 推断 mRNA
Inferring mRNA from Protein Rosalind
问题
对于正整数aa和nn,aa modulo nn(shorthand中写成amodnamodn)是aa除以的余数嗯。比如29mod11=729mod11=7 因为29=11×2+729=11×2+7.
模数运算是关于modulo 运算的加、减、乘、除的研究。如果amodn=bmodnamodn=bmodn,我们说aa和bb全等modulo nn;在这种情况下,我们使用符号 a≡bmodna≡bmodn.
mod元运算中的两个有用的事实是,如果 a≡bmodna≡bmodn 和 c≡dmodnc≡dmodn,则a+c≡b+dmodna+c≡b+dmodn且a×c≡b×dmodna×c≡b× dmodn。为了检查您对这些规则的理解,您可能希望验证 a=29a=29、b=73b=73、c=10c=10、d=32d=32 和 n=11n=11 的这些关系。
正如您将在本练习中看到的那样,一些 Rosalind 问题会要求一个(非常大的)整数解 modulo 一个较小的数字以避免存储如此大的数字时出现的计算陷阱。
给定:长度最多为 1000 个氨基酸的蛋白质串。
Return:可以翻译蛋白质的不同 RNA 串的总数,modulo 1,000,000。 (不要忽视终止密码子在蛋白质翻译中的重要性。)
示例数据集
均线
示例输出
12
我的答案总是设置为零。我意识到使用 mod 的方式存在一些问题,但我不知道那到底是什么。
rna_table = {"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"}
with open("rosalind_mrna.txt") as myfile:
data = myfile.readlines()
charData = list(data[0].strip())
frequency_list = {};
for k,v in rna_table.items():
if not frequency_list.has_key(v):
frequency_list[v] = 1
else:
frequency_list[v] += 1
answer = frequency_list['STOP'];
for aa in charData:
answer = ((answer * frequency_list[aa]) % 1000000)
print "Answer is:\n"
print answer % 1000000
几个小问题:
- 你打错了:
"UCC":"s"
应该是"UCC":"S"
if not frequency_list.has_key(v):
更Python写成if v not in frequency_list:
(事实上.has_key
已经从Python3中删除)
charData = list(data[0].strip())
- list()
不需要,你也可以直接遍历字符串
frequency_list = {};
- 不需要尾随分号
print answer % 1000000
- 最后的 % 1000000
是不必要的,它已经在计算 answer
的循环中完成了
所以它看起来像例子,MA
,工作起来像
(
{number of ways to encode M == 1}
* {number of ways to encode A == 4}
* {number of ways to encode STOP == 3}
)
% 1000000
如前所述,结果为 12。
你的代码按原样为我工作,返回 827968
。我会查看您的 rosalind_mrna.txt
副本(确保它不是空白文件)并检查 data
的内容(确保它正确加载文件)。
为了比较,我会写成
from functools import reduce
from operator import mul
freq = {
'A': 4, 'C': 2, 'D': 2, 'E': 2,
'F': 2, 'G': 4, 'H': 2, 'I': 3,
'K': 2, 'L': 6, 'M': 1, 'N': 2,
'P': 4, 'Q': 2, 'R': 6, 'S': 6,
'T': 4, 'V': 4, 'W': 1, 'Y': 2,
'STOP': 3
}
def load_dna_file(fname):
with open(fname) as inf:
dna = inf.read()
return "".join(dna.split()) # removes all whitespace
def num_rna_strings(dna, modulo=None):
if modulo:
reduce_fn = lambda a, b: (a * b) % modulo
else:
reduce_fn = mul
freqs = (freq[base] for base in dna)
return reduce(reduce_fn, freqs, freq["STOP"])
def main():
dna = load_dna_file("rosalind_mrna.txt")
num = num_rna_strings(dna, 1000000)
print("Answer is {}".format(num))
if __name__ == "__main__":
main()
有趣的是,如果不使用模数,则完整答案为 423 位长 (6.186 * 10 ** 422)
问题
对于正整数aa和nn,aa modulo nn(shorthand中写成amodnamodn)是aa除以的余数嗯。比如29mod11=729mod11=7 因为29=11×2+729=11×2+7.
模数运算是关于modulo 运算的加、减、乘、除的研究。如果amodn=bmodnamodn=bmodn,我们说aa和bb全等modulo nn;在这种情况下,我们使用符号 a≡bmodna≡bmodn.
mod元运算中的两个有用的事实是,如果 a≡bmodna≡bmodn 和 c≡dmodnc≡dmodn,则a+c≡b+dmodna+c≡b+dmodn且a×c≡b×dmodna×c≡b× dmodn。为了检查您对这些规则的理解,您可能希望验证 a=29a=29、b=73b=73、c=10c=10、d=32d=32 和 n=11n=11 的这些关系。
正如您将在本练习中看到的那样,一些 Rosalind 问题会要求一个(非常大的)整数解 modulo 一个较小的数字以避免存储如此大的数字时出现的计算陷阱。
给定:长度最多为 1000 个氨基酸的蛋白质串。
Return:可以翻译蛋白质的不同 RNA 串的总数,modulo 1,000,000。 (不要忽视终止密码子在蛋白质翻译中的重要性。)
示例数据集
均线
示例输出
12
我的答案总是设置为零。我意识到使用 mod 的方式存在一些问题,但我不知道那到底是什么。
rna_table = {"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"}
with open("rosalind_mrna.txt") as myfile:
data = myfile.readlines()
charData = list(data[0].strip())
frequency_list = {};
for k,v in rna_table.items():
if not frequency_list.has_key(v):
frequency_list[v] = 1
else:
frequency_list[v] += 1
answer = frequency_list['STOP'];
for aa in charData:
answer = ((answer * frequency_list[aa]) % 1000000)
print "Answer is:\n"
print answer % 1000000
几个小问题:
- 你打错了:
"UCC":"s"
应该是"UCC":"S"
if not frequency_list.has_key(v):
更Python写成if v not in frequency_list:
(事实上.has_key
已经从Python3中删除)charData = list(data[0].strip())
-list()
不需要,你也可以直接遍历字符串frequency_list = {};
- 不需要尾随分号print answer % 1000000
- 最后的% 1000000
是不必要的,它已经在计算answer
的循环中完成了
所以它看起来像例子,MA
,工作起来像
(
{number of ways to encode M == 1}
* {number of ways to encode A == 4}
* {number of ways to encode STOP == 3}
)
% 1000000
如前所述,结果为 12。
你的代码按原样为我工作,返回 827968
。我会查看您的 rosalind_mrna.txt
副本(确保它不是空白文件)并检查 data
的内容(确保它正确加载文件)。
为了比较,我会写成
from functools import reduce
from operator import mul
freq = {
'A': 4, 'C': 2, 'D': 2, 'E': 2,
'F': 2, 'G': 4, 'H': 2, 'I': 3,
'K': 2, 'L': 6, 'M': 1, 'N': 2,
'P': 4, 'Q': 2, 'R': 6, 'S': 6,
'T': 4, 'V': 4, 'W': 1, 'Y': 2,
'STOP': 3
}
def load_dna_file(fname):
with open(fname) as inf:
dna = inf.read()
return "".join(dna.split()) # removes all whitespace
def num_rna_strings(dna, modulo=None):
if modulo:
reduce_fn = lambda a, b: (a * b) % modulo
else:
reduce_fn = mul
freqs = (freq[base] for base in dna)
return reduce(reduce_fn, freqs, freq["STOP"])
def main():
dna = load_dna_file("rosalind_mrna.txt")
num = num_rna_strings(dna, 1000000)
print("Answer is {}".format(num))
if __name__ == "__main__":
main()
有趣的是,如果不使用模数,则完整答案为 423 位长 (6.186 * 10 ** 422)