1

リーディング フレームに関する以前の質問に対するフォローアップの質問を投稿しています。

sequence = 'AAATGAAATAAGGATGGGGTAGTATGATGTGTTT'

私は最終的に特定のパターン「ATG」を探しており、それが見つかるまで入力シーケンスをスキャンしたいと考えています。それが見つかったら、「TAA」または「TAG」または「TGT」のいずれかの別のシーケンスが見つかるまで 3 の読み取りフレームで続行し、下流の「TAA」で次の「ATG」が見つかるまでスキャンを続けます。 ' または 'TAG' または 'TGT'

codon_list = ['ATG','AAA','TAA'],['ATG','GGG','TAG'],['ATG','ATG','TGT']

私はこれを試していました

start_frame = sequence.find('ATG')

しかし、「ATG」の最初の出現しか得られません。(つまり「2」)

私が書いたコドンの最初のリストのためだけに

for codon in range(len(sequence)):
    next_codon = fdna[start_frame:start_frame + 3]
    codon_list.append(next_codon)
    start_frame = start_frame + 3
    if next_codon == 'TAA': 
        break
    if next_codon == 'TAG':
        break
    elif next_codon=='TGT':
        break
print codon_list
>>> ['ATG','AAA','TAA']

「ATG」の最初の出現に対してのみ機能します。

次の部分は、各コドン (0、1、2、3、...) の名前を作成する場所であり、その部分を理解したと思います。

indx = range(0,len(codon_list))

indx_codon = dict(zip(indx,codon_list)

indx_codon = {0:['ATG','AAA','TAA'],1:['ATG','GGG','TAG'],2:['ATG','ATG','TGT']}

codon_start = ['2','13','23']
codon_end = ['8','21','31']
codon_positions = []

for p,q in zip(codon_start,codon_end):
    codon_positions.append(str(p)+':'+str(q))

print codon_positions
>>> ['2:8', '13:21', '23:31']

したがって、私の最大の問題は、.find()関数が最初のオカレンスに対してのみ機能し、「ATG」の前に「TAA」、「TAG」、または「TGT」がある場合、インデックスを作成するときにめちゃくちゃになることです3) の読み枠を開始することになっているものです。

これらの基準に従う複数の配列のリストを作成するにはどうすればよいですか (つまり、配列を codon_list に変換します)?

4

1 に答える 1

3

正規表現を使用したかなり簡潔なソリューションを次に示します。

import re
sequence = 'AAATGAAATAAGGATGGGGTAGTATGATGTGTTT'
codons = re.findall(r'ATG(?:...)*?(?:TAA|TAG|TGT)', sequence)
codon_list = [[s[i:i+3] for i in range(0, len(s), 3)] for s in codons]

結果:

>>> codon_list
[['ATG', 'AAA', 'TAA'], ['ATG', 'GGG', 'TAG'], ['ATG', 'ATG', 'TGT']]
于 2012-09-21T23:10:12.610 に答える