试图找到大字符串中的子串

时间:2016-05-31 08:50:51

标签: python dna-sequence

鉴于此字符串

dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"

以下代码应打印以下4个子字符串。

ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGTGA

然而,它正在打印以下内容:

ATGTAA
ATGAATGACTGATAG
ATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTTGTATGCTATGAAAATGTGAAATGACCC
ATGCTATGA
ATGAAAATGTGA
ATGTGA
ATGACCC
None

请有人帮我解决这个问题。谢谢。

def findStopIndex(dna,index):

    stop1 = dna.find("tga",index)
    if(stop1 == -1 or (stop1-index) % 3 != 0):
        stop1 = len(dna)

    stop2 = dna.find("taa",index)
    if(stop2 == -1 or (stop2-index) % 3 != 0):
        stop2 = len(dna)

    stop3 = dna.find("tag",index)
    if(stop3 == -1 or (stop3-index) % 3 != 0):
        stop3 = len(dna)

    return min(stop1, min(stop2,stop3))  

def printAll(dna):
    gene = None
    start = 0
    while(True):
        loc = dna.find("atg", start)
        if(loc == -1):break
        stop = findStopIndex(dna,loc+3)
        gene = dna[loc:stop+3]
        print gene.upper()
        start = loc + 3


print printAll(dna3.lower())

5 个答案:

答案 0 :(得分:1)

我认为你可以更好地解释它,但是为了获得你想要的东西,你不能像那样返回分钟,或者当你必须以其他方式对待它时。你得到的长链是因为你正在回归' 60'这是整个序列的长度。我对代码进行了一些修改,它只会选择以“tga'”,“taa'”或“' tag'”之一结尾的序列。

def findStopIndex(dna, index):
    stop1 = dna.find("tga", index)
    if (stop1 == -1 or (stop1 - index) % 3 != 0):
        stop1 = len(dna)
    stop2 = dna.find("taa", index)
    if (stop2 == -1 or (stop2 - index) % 3 != 0):
        stop2 = len(dna)
    stop3 = dna.find("tag", index)
    if (stop3 == -1 or (stop3 - index) % 3 != 0):
        stop3 = len(dna)
    end_sequence = min(stop1, stop2, stop3)if min(stop1, stop2, stop3) < 60 else None
    return end_sequence

def printAll(dna):
    start = 0
    while True:
        loc = dna.find("atg", start)
        if loc == -1:
            break
        stop = findStopIndex(dna, loc + 3)
        if stop:
            gene = dna[loc:stop+3]
            print(gene.upper())
        start = loc + 3
    return

printAll(dna3.lower())

<强>输出:

ATGTAA
ATGAATGACTGATAG
ATGCTATGA
ATGAAAATGTGA
ATGTGA

答案 1 :(得分:0)

的变化:

1)min应该使用“key = int”,否则排序将以字符串...

完成
return min(stop1,stop2,stop3, key=int)  

2)使用exit替换break以避免使用while

时的另一个循环

答案 2 :(得分:0)

我们可能需要一些关于DNA结构的其他信息。根据您的描述,感觉像的子串不能相互重叠。在这种情况下,您需要将start = loc + 3替换为start = stop + 3(字符似乎按3分组,也基于您所描述的内容)。

最后,您不需要print中的print printAll(dna3.lower()),因为它会在结果集的末尾显示None(该功能不具备返回值)。

通过这些修改,我的输出是:

ATGTAA
ATGAATGACTGATAG
ATGCTTGTATGCTATGAAAATGTGAAATGACCC

希望它会有所帮助。

答案 3 :(得分:0)

将start = loc + 3更改为 start = loc + len(gene)+ 3

def findStopIndex(dna,index):

    stop1 = dna.find("tga",index)
    if(stop1 == -1 or (stop1-index) % 3 != 0):
        stop1 = len(dna)

    stop2 = dna.find("taa",index)
    if(stop2 == -1 or (stop2-index) % 3 != 0):
        stop2 = len(dna)

    stop3 = dna.find("tag",index)
    if(stop3 == -1 or (stop3-index) % 3 != 0):
        stop3 = len(dna)

    return min(stop1, min(stop2,stop3))

def printAll(dna):
    gene = None
    start = 0
    while(True):
        loc = dna.find("atg", start)
        if(loc == -1):break
        stop = findStopIndex(dna,loc+3)
        gene = dna[loc:stop+3]
        print gene.upper()
        start = loc +len(gene)+ 3

dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC"
printAll(dna3.lower())

答案 4 :(得分:0)

我认为,你不想要结果,导致打印字符串直到最后,所以你必须排除这些情况。 最好在所有结局中使用for循环:

def findStopIndex(dna, index):
    stops = []
    for tag in ["TGA", "TAA", "TAG"]:
        stop = dna.find(tag, index)
        if stop >= 0 and (stop - index) % 3 == 0:
            stops.append(stop)
    return min(stops)

def printAll(dna):
    dna = dna.upper()
    start = 0
    while True:
        loc = dna.find("ATG", start)
        if loc == -1:
            break
        try:
            stop = findStopIndex(dna, loc + 3)
        except ValueError:
            # no ending found
            pass
        else:
            print(dna[loc:stop+3])
        start = loc + 3

printAll(dna3)

但是我认为,你真正想要的是找到TGA,TAA和TAG中的一个,即使TGA发生在一个位置之间,也就是不能被3整除。这可以通过正则表达式完成:

import re

def printAll(dna):
    dna = dna.upper()
    start = 0
    while True:
        mtch = re.search("ATG(...)*?(TGA|TAA|TAG)", dna[start:])
        if not mtch:
            break
        print(mtch.group())
        start += mtch.start() + 3

printAll(dna3)

并导致另外两次出现:

ATGTAA
ATGAATGACTGA
ATGACTGATAGATATGCTTGTATGCTATGA
ATGCTTGTATGCTATGAAAATGTGAAATGA
ATGCTATGA
ATGAAAATGTGA
ATGTGA