2016-05-31 102 views
0

鉴于此字符串试图找到子在大字符串

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()) 
+0

要调试这一点,我将打印指数,停止1,停止2和停止3的值。我怀疑你会看到价值观并不是你所期望的。 –

+0

'min'可以和多个参数一起使用:'min(stop1,stop2,stop3)'。 – Daniel

+0

'if'和'while'不是函数,因此括号是不必要的。 – Daniel

回答

0

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

最后,您不需要print printAll(dna3.lower())中的print,因为它在结果集的末尾显示了None(该函数没有返回值)。

有了这些修改,我的输出是:

ATGTAA 
ATGAATGACTGATAG 
ATGCTTGTATGCTATGAAAATGTGAAATGACCC 

希望能对大家有所帮助。

+0

他想要搜索所有子字符串。如果你做了'start = stop + 3',你将跳过一些子串 – qvpham

+0

@julivico返回的停止索引是3个字符组的** first **字符的索引,因此是我的+3。这也是他打印'dna [loc:stop + 3]'的原因。 – 3kt

+0

看看输出ATGAATGACTGATAG。这个字符串中有'ATG'。如果你使用'stop + 3',你会跳过它。 – qvpham

0

变化:

1)分应该使用 “键= INT”;否则,排序工作将作为字符串...

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

2)破与退出,以避免更换另一个循环与同时

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 
+0

删除print中的print printAll(dna3.lower()))将会删除输出'None'。函数printAll不返回任何内容(或None)。 – qvpham

+1

@ julivico:是的,我看到3kt的答案,然后它也打我。谢谢! –

0

变化开始= LOC + 3 开始= LOC + LEN(基因)+ 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()) 
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