Python| Inferring mRNA from Protein
在上一章,小编分享了Rosalind的一套题目:Rosalind Java|Inferring mRNA from Protein。
其题目大意如下:给出一段蛋白质序列,求其可能的mRNA数量,并将其取余数(mod)。
实现思路如下:
1.获取整条蛋白质序列,并分别获得其单独的氨基酸字符。
2.单个氨基酸对应其mRNA密码子个数,并做累乘。
3.累乘完全部氨基酸对应mRNA密码子个数后,考虑3个终止密码子的影响。
在博客之后留下了一个悬念,也就是用Python方案编写本道题。思路与上一篇如出一辙,以下提供其代码:
codon_map = {
'UUU': 'F', 'CUU': 'L', 'AUU': 'I', 'GUU': 'V',
'UUC': 'F', 'CUC': 'L', 'AUC': 'I', 'GUC': 'V',
'UUA': 'L', 'CUA': 'L', 'AUA': 'I', 'GUA': 'V',
'UUG': 'L', 'CUG': 'L', 'AUG': 'M', 'GUG': 'V',
'UCU': 'S', 'CCU': 'P', 'ACU': 'T', 'GCU': 'A',
'UCC': 'S', 'CCC': 'P', 'ACC': 'T', 'GCC': 'A',
'UCA': 'S', 'CCA': 'P', 'ACA': 'T', 'GCA': 'A',
'UCG': 'S', 'CCG': 'P', 'ACG': 'T', 'GCG': 'A',
'UAU': 'Y', 'CAU': 'H', 'AAU': 'N', 'GAU': 'D',
'UAC': 'Y', 'CAC': 'H', 'AAC': 'N', 'GAC': 'D',
'UAA': 'Stop', 'CAA': 'Q', 'AAA': 'K', 'GAA': 'E',
'UAG': 'Stop', 'CAG': 'Q', 'AAG': 'K', 'GAG': 'E',
'UGU': 'C', 'CGU': 'R', 'AGU': 'S', 'GGU': 'G',
'UGC': 'C', 'CGC': 'R', 'AGC': 'S', 'GGC': 'G',
'UGA': 'Stop', 'CGA': 'R', 'AGA': 'R', 'GGA': 'G',
'UGG': 'W', 'CGG': 'R', 'AGG': 'R', 'GGG': 'G'
}
def codon_frequency():
frequency = {}
for k, v in codon_map.items():
if v not in frequency:
frequency[v] = 0
frequency[v] += 1
return (frequency)
def possible_sequences(sequence):
f = codon_frequency()
n = f['Stop']
for seq in sequence:
n *= f[seq]
# print(n)
return (n % 1000000)
with open('C:/Users/Administrator/Desktop/rosalind_mrna.txt') as file:
protein_seq = file.read().strip()
print(possible_sequences(protein_seq))
取余方式的调整——分步取余
在python的解决方案中,由于没有变量类型内存的限制,暴力累乘是可以得到正确结果的。然而由于java语言中long类型或者int类型都是有取值范围的,因此会出现内存溢出的情况。故而采用边累乘边取余的方式。 值得注意的是,累乘导致积数巨大,积数的位数不断飙升。高位数是不断受到低位数(比如个位和十位上的数)累乘而变化的。但是其低位的数却不受高位的影响,一句话来讲:百万位以下的数(低位数)该怎么乘还怎么成。因此分布取余能够在不影响最终结果的情况下减少计算负荷,减少计算资源的消耗。