簡體   English   中英

羅莎琳德將rna翻譯成蛋白python

[英]Rosalind translating rna into protein python

這是我對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')prot('AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA')得到正確的輸出'MAMAPRTEINSTRING' 但是,如果rna(輸入字符串)的序列是數百個核苷酸(字符)長,則會出現錯誤:

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

你能指出我哪里出問題了嗎?

假設您有KeyError ,那么問題一定出在您嘗試訪問codon_table[rnaList[i]]嘗試之一中。 您假設rnalist每個項目都是三個字符,但是顯然在某些時候,它不再是True並且其中一個項目是'CUGGAAACGCAGCCGACAUUCGCUGAAGUGUAG'

發生這種情況的原因是,當您重新分配rna = rna[:i]+','+rna[i:]將更改rna的長度 ,以使索引i不再到達列表的末尾。 這意味着對於len(rna) > 60任何rna ,列表中的最后一個項目的長度都不會為3。如果在到達該項目之前有一個終止密碼子,這不是問題,但是如果到達它,則可以獲取KeyError

我建議您重寫函數的開始,例如使用itertoolsgrouper 配方

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)

簡化您的代碼。

這不能回答您的問題,但是請注意,您可以使用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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM