0

这是我对 rosalind 项目问题的解决方案。

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 的序列(输入字符串)是数百个核苷酸(字符)长,我得到一个错误:

 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 11, in prot
 KeyError: 'CUGGAAACGCAGCCGACAUUCGCUGAAGUGUAG'

你能指出我哪里出错了吗?

4

3 回答 3

2

鉴于您有一个KeyError,问题一定出在您的访问尝试中codon_table[rnaList[i]]。您假设其中的每个项目rnalist都是三个字符,但显然,在某些时候,它不再是True并且其中一个项目是'CUGGAAACGCAGCCGACAUUCGCUGAAGUGUAG'.

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

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

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)]
    ...

另请注意,您可以使用

peptide.append(codon_table[rnaList[i]])

return "".join(peptide)

简化您的代码。

于 2014-04-29T18:43:42.667 回答
1

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

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))

例如:

>>> print rna2prot('AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA')
MAMAPRTEINSTRING
于 2015-08-21T14:32:54.313 回答
0

您将 rna 分成 3 个字符块的代码有点讨厌;您花费大量时间来破坏和重建字符串而没有真正的目的。

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

这是一个简化版本:

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)
于 2014-04-29T19:16:25.190 回答