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、問題は にアクセスしようとする試みの 1 つにあるに違いありませんcodon_table[rnaList[i]]。の各アイテムは 3 文字であると想定していますがrnalist、明らかに、ある時点でそれはなくTrueなり、アイテムの 1 つが になります'CUGGAAACGCAGCCGACAUUCGCUGAAGUGUAG'

これは、再割り当て時にの長さrna = rna[:i]+','+rna[i:]を変更すると、インデックスがリストの最後に到達しなくなるために発生します。これは、任意のwhereについて、リストの最後の項目の長さが 3 にならないことを意味します。項目に到達する前に終止コドンがある場合は問題ありませんが、到達すると . が得られます。rnairnalen(rna) > 60KeyError

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 に答える
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 に答える