蛋白质序列模式匹配python

时间:2012-06-13 15:49:32

标签: python algorithm for-loop pattern-matching sequence

我正在研究蛋白质序列的匹配算法。我从一个对齐的蛋白质序列开始,我试图将错误对齐的序列转换为正确对齐的序列。这是一个例子:

原始对齐序列:---- AB - C-D -----

错位序列: - A - BC --- D -

预期输出应如下所示:

原始对齐序列:---- AB - C-D -----

错位序列:---- AB - C-D -----(两者现在都相同)

我被告知对我的问题非常具体,但我想要匹配的序列长度大约为4000个字符,粘贴在这里时看起来很荒谬。我会发布代表我的问题的两个序列,这应该做。

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 -

--- A-A - A ---- -----甲-----甲

我似乎无法让循环在字母之间多次正确删除不需要的破折号,因为其余的循环迭代用于添加破折号/删除破折号对。
这是这里问题的良好开端。

如何成功编写此循环以获得所需的输出(两个相同的序列)

2 个答案:

答案 0 :(得分:3)

序列比对的问题是众所周知的,并且其解决方案已被充分描述。有关介绍性文字,请参阅Wikipedia。我所知道的最佳解决方案涉及动态编程,您可以在this site看到Java中的示例实现。

答案 1 :(得分: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--