首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rosalind将rna翻译成蛋白质python

Rosalind将rna翻译成蛋白质python
EN

Stack Overflow用户
提问于 2014-04-29 18:28:58
回答 3查看 3K关注 0票数 0

以下是我对问题 of rosalind项目的解决方案。

代码语言:javascript
复制
def prot(rna):
  for i in xrange(3, (5*len(rna))//4+1, 4):
    rna=rna[:i]+','+rna[i:]
  rnaList=rna.split(',')
  bases=['U','C','A','G']
  codons = [a+b+c for a in bases for b in bases for c in bases]
  amino_acids = 'FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG'
  codon_table = dict(zip(codons, amino_acids))
  peptide=[]
  for i in range (len (rnaList)):
    if codon_table[rnaList[i]]=='*':
      break
    peptide+=[codon_table[rnaList[i]]]
  output=''
  for i in peptide:
    output+=str(i)
  return output

如果运行prot('AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA'),就会得到正确的输出'MAMAPRTEINSTRING'。然而,如果rna序列(输入字符串)是数百个核苷酸(字符),我得到一个错误:

代码语言:javascript
复制
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 11, in prot
 KeyError: 'CUGGAAACGCAGCCGACAUUCGCUGAAGUGUAG'

你能指出我哪里出了问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-29 18:43:42

考虑到您有一个KeyError,那么问题肯定是在您尝试访问codon_table[rnaList[i]]时出现的。假设rnalist中的每一项都是三个字符,但在某种程度上,这显然不再是True,其中一个项是'CUGGAAACGCAGCCGACAUUCGCUGAAGUGUAG'

这是因为当您重新分配rna = rna[:i]+','+rna[i:]时,您更改了rna的长度,这样索引i就不再到达列表的末尾。这意味着对于任何rna,在len(rna) > 60中,列表中的最后一项都不会有3长度。如果在到达项目之前有一个停止密码子,这不是问题,但是如果您到达它,就会得到KeyError

我建议您重写函数的开头,例如使用grouper itertools

代码语言:javascript
复制
from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

def prot(rna):
    rnaList = ["".join(t) for t in grouper(rna, 3)]
    ...

还请注意,您可以使用

代码语言:javascript
复制
peptide.append(codon_table[rnaList[i]])

代码语言:javascript
复制
return "".join(peptide)

来简化你的代码。

票数 2
EN

Stack Overflow用户

发布于 2015-08-21 14:32:54

这并不能回答您的问题,但是请注意,您可以使用BioPython非常简洁地解决这个问题。

代码语言:javascript
复制
from Bio.Seq import Seq
from Bio.Alphabet import IUPAC

def rna2prot(rna):
    rna = Seq(rna, IUPAC.unambiguous_rna)
    return str(rna.translate(to_stop=True))

例如:

代码语言:javascript
复制
>>> print rna2prot('AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA')
MAMAPRTEINSTRING
票数 1
EN

Stack Overflow用户

发布于 2014-04-29 19:16:25

将rna分解为3 char块的代码有点麻烦;您需要花费大量的时间来分解和重建字符串,而不是为了真正的目的。

构建codon_table只需要完成一次,而不是每次运行函数时。

以下是一个简化的版本:

代码语言:javascript
复制
from itertools import product, takewhile

bases = "UCAG"
codons = ("".join(trio) for trio in product(bases, repeat=3))
amino_acids = 'FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG'
codon_table = dict(zip(codons, amino_acids))

def prot(rna):
    rna_codons = [rna[i:i+3] for i in range(0, len(rna) - 2, 3)]
    aminos = takewhile(
        lambda amino: amino != "*",
        (codon_table[codon] for codon in rna_codons)
    )
    return "".join(aminos)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23372512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档