0

我正在研究 python 和生物序列。
我有一个序列。

seq1 = \
...        """ atgaaatttatcattgaacgtgagcatctgctaaaaccactgcaacaggtcagtagcccg
...        ctgggtggacgccctacgttgcctattttgggtaacttgttgctgcaagtcacggaaggc
...        tctttgcggctgaccggtaccgacttggagatggagatggtggcttgtgttgccttgtct
...        cagtcccatgagccgggtgctaccacagtacccgcacggaagttttttgatatctggcgt
...        ggtttacccgaaggggcggaaattacggtagcgttggatggtgatcgcctgctagtgcgc
...        tctggtcgcagccgtttctcgctgtctaccttgcctgcgattgacttccctaatctggat
...        gactggcagagtgaggttgaattcactttaccgcaggctacgttaaagcgtctgattgag
...        tccactcagttttcgatggcccatcaggatgtccgttattatttgaacggcatgctgttt
...        gagaccgaaggcgaagagttacgtactgtggcgaccgatgggcatcgcttggctgtatgc
...        tcaatgcctattggccagacgttaccctcacattcggtgatcgtgccgcgtaaaggtgtg
...        atggagctggttcggttgctggatggtggtgatacccccttgcggctgcaaattggcagt
...        aataatattcgtgctcatgtgggcgattttattttcacatctaagctggttgatggccgt
...        ttcccggattatcgccgcgtattgccgaagaatcctgataaaatgctggaagccggttgc
...        gatttactgaaacaggcattttcgcgtgcggcaattctgtcaaatgagaagttccgtggt
...        gttcggctctatgtcagccacaatcaactcaaaatcactgctaataatcctgaacaggaa
...        gaagcagaagagatcctcgatgttagctacgaggggacagaaatggagatcggtttcaac
...        gtcagctatgtgcttgatgtgctaaatgcactgaagtgcgaagatgtgcgcctgttattg
...        actgactctgtatccagtgtgcagattgaagacagcgccagccaagctgcagcctatgtc
...        gtcatgccaatgcgtttgtag"""

seq2 = \
...        """ accgtagcatctgctaaaaccagtacgcccg
...        ctgggtggacgatgcaacttgttgctgcaagtcacggaaggc
...        tctttgcggctgaccggtaccgacttggagatggagatggtggcttgtgttgccttgtct
...        cagtcccatgagccgggtgctaccacagtacccgcacggaagttttttgatatctggcgt
...        ggtttacccgaaggggcggaaattacggtagcgttggatggtgcatgatcgcctgctagtgcgc
...        tctggtcgcagccgtttctcgctgtctaccttgcctgcgattgacttccctaatctggat
...        gactggcagagtgaggttgaattcactttaccgcaggctacgttaaagcgtctgattgag
...        tccactcagttttcgatgctatttatgtccgttattatttgaacggcatgctgttt
...        gagaccgaaggcgaagagttacgtactgtggcgaccgatgggcatcgcttggctgtatgc
...        tcaatgcctattggccaggctaattcggtgatcgtgccgcgtaaaggtgtg
...        atggagctggttcggttgctggatggtggtgatacccccggcccctgcaaattggcagt
...        aataatattcgtgctcatgtgggcgattttattttcacatctaagctggttgatggccgt
...        ttcccggattatcgccgcgtattgccgaagaatcctgataaaatgctggaagccggttgc
...        gtcatgccaatgcgtttgtag"""

我想知道 seq1 和 seq2 中有多少个字符串是相同的以及它们各自的位置。这不仅是模式匹配,也是获取位置。谁能告诉我如何使用 python 做同样的事情?

4

3 回答 3

1

索引器函数将所有位置作为列表返回

def indexer(s, sub):
    positions=[]
    pos=0
    while True:
        pos=s.find(sub,pos+1)
        if pos==-1:
            return positions
        else:
            positions.append(pos)

matcher 函数将返回一个字典。dict 中的每个键都是在 a 和 b 中都可用的序列,相应的 dict 值是 2 项元组,其中包含 a 的所有匹配位置和 b 的所有匹配位置:

def matcher(a,b):
    sequences=set()
    for l in range(1,len(a)):
        for pos in range(len(a)):
            sequences.add(a[pos:pos+l])
    for l in range(1,len(b)):
        for pos in range(len(b)):
            sequences.add(b[pos:pos+l]) 
    matches={}
    for seq in sequences:
        matches_a=indexer(a,seq)
        matches_b=indexer(b,seq)
        if result_a and result_b:
            matches[seq]=(matches_a,matches_b)
    return matches

这个例子应该工作:

print matcher('asdfasdfa','asdfasasdfasdfasdfadfasdfdf') 
于 2012-08-27T13:53:15.547 回答
0

也许Wikibooks可以帮助您入门?

于 2012-08-27T13:44:45.953 回答
0

你可以使用index

>>> seq.index(str)
1046

请注意,它会为您找到第一次出现的位置。然后,您可以尝试从切片中查找其他事件。

已编辑

当有多次出现时,这样的循环可能会起作用:

test = seq1 + ""
try:
    while test:
        position = test.index(str_)
        positions.append(position + last_position)
        position += len(str_)
        last_position += position
        test = test[position:]
except ValueError:
    print positions

我们制作字符串的副本,seq因为我们将使用它。然后,我们继续使用该index方法检查位置,将其存储positions并相应地更新字符串。

[PS] 调用变量的坏主意str,你正在覆盖一个内置的......

于 2012-08-27T13:42:11.673 回答