Rosalind Python|Inferring mRNA from Protein

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类型都是有取值范围的,因此会出现内存溢出的情况。故而采用边累乘边取余的方式。 值得注意的是,累乘导致积数巨大,积数的位数不断飙升。高位数是不断受到低位数(比如个位和十位上的数)累乘而变化的。但是其低位的数却不受高位的影响,一句话来讲:百万位以下的数(低位数)该怎么乘还怎么成。因此分布取余能够在不影响最终结果的情况下减少计算负荷,减少计算资源的消耗。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值