2016-05-31 97 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