2

私はタンパク質配列のマッチングアルゴリズムに取り組んでいます。私は整列したタンパク質配列から始めており、誤って整列した配列を正しく整列した配列に変換しようとしています。次に例を示します。

元の整列されたシーケンス:---- AB--CD -----

シーケンスのずれ:-A--BC --- D-

期待される出力は次のようになります。

元の整列されたシーケンス:---- AB--CD -----

シーケンスのずれ:---- AB--CD -----(両方とも同じになりました)

問題について非常に具体的に言われていますが、一致させようとしているシーケンスは4000文字を超えており、ここに貼り付けるとばかげているように見えます。ただし、私の問題を表す2つのシーケンスを投稿しますが、それで十分です。

seq="---A-A--AA---A--"
newseq="AA---A--A-----A-----"
seq=list(seq) #changing maaster sequence from string to list
newseq=list(newseq) #changing new sequence from string to list
n=len(seq) #obtaining length of master sequence
newseq.extend('.') #adding a tag to end of new sequence to account for terminal gaps

print(seq, newseq,n) #verification of sequences in list form and length

for i in range(n)
    if seq[i]!=newseq[i]:
        if seq[i] != '-': #gap deletion
            del newseq[i]

        elif newseq[i] != '-':
            newseq.insert(i,'-') #gap insertion


        elif newseq[i] == '-':
            del newseq[i]


old=''.join(seq) #changing list to string
new=''.join(newseq) #changing list to string
new=new.strip('.') #removing tag

print(old) #verification of master-sequence fidelity
print(new) #verification of matching sequence

この特定のコードとシーケンスのセットから得られる出力は次のとおりです。

--- AA--AA --- A--

--- AA--A ---- A ----- A -----

ループの残りの反復はダッシュの追加とダッシュの削除のペアで使用されるため、文字の間にある不要なダッシュを複数回正しく削除するループを取得できないようです。
これは、ここでの問題の良いスタートです。

このループを正常に記述して、目的の出力(2つの同一のシーケンス)を取得するにはどうすればよいですか?

4

2 に答える 2

3

配列アラインメントの問題はよく知られており、その解決策はよく説明されています。紹介テキストについては、ウィキペディアを参照してください。私が知っている最善の解決策は動的計画法であり、このサイトでJavaでの実装例を見ることができます。

于 2012-06-13T16:30:32.710 に答える
0

私はあなたのコードを編集しました、そしてそれは今正しい出力を与えています:

seq="----AB--C-D-----"
newseq="--A--BC---D-"
seq=list(seq) #changing maaster sequence from string to list
newseq=list(newseq) #changing new sequence from string to list
n=len(seq) #obtaining length of master sequence
newseq.extend('.') #adding a tag to end of new sequence to account for terminal gaps

print(seq, newseq,n) #verification of sequences in list form and length
for i in range(len(seq)):
    if seq[i]!=newseq[i]:
       if seq[i]=='-':
           newseq.insert(i,'-')

       elif newseq[i]=='-':
           newseq.insert(i,seq[i])
       else:
           newseq.insert(i,seq[i])

else:
    newseq=newseq[0:len(seq)]

old=''.join(seq) #changing list to string
new=''.join(newseq) #changing list to string
new=new.strip('.') #removing tag

print(old) #verification of master-sequence fidelity
print(new) #verification of matching sequence

出力:

----AB--C-D-----
----AB--C-D-----

とのためにAA---A--A-----A-----

---A-A--AA---A--
---A-A--AA---A--
于 2012-06-13T16:31:48.463 に答える