2016-05-31 13 views
0

Da dieser StringVersuch Substrings in großen String

dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC" 

der folgende Code zu finden folgende 4 Teil gedruckt werden soll.

ATGTAA 
ATGAATGACTGATAG 
ATGCTATGA 
ATGTGA 

Jedoch ist es den Druck der folgende:

ATGTAA 
ATGAATGACTGATAG 
ATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC 
ATGCTTGTATGCTATGAAAATGTGAAATGACCC 
ATGCTATGA 
ATGAAAATGTGA 
ATGTGA 
ATGACCC 
None 

kann jemand bitte helfen Sie mir dies herauszufinden. Vielen Dank.

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

Um dies zu debuggen Ich würde die Werte des Index, stop1, stop2 und STOP3 drucken. Ich vermute, Sie werden dann sehen, dass der Wert nicht das ist, was Sie erwartet haben. –

+0

'min' kann mit mehreren Argumenten verwendet werden:' min (stop1, stop2, stop3) '. – Daniel

+0

'if' und' while' sind keine Funktionen, daher sind die Klammern unnötig. – Daniel

Antwort

0

Wir über DNA-Struktur einige zusätzliche Informationen benötigen. Von dem, was Sie beschrieben haben, fühlt es sich an, als ob sich die Teilstrings nicht gegenseitig überlappen können. In diesem Fall müssen Sie start = loc + 3 durch start = stop + 3 ersetzen (die Zeichen scheinen gruppiert 3 von 3, auch basiert und was Sie beschrieben).

Schließlich benötigen Sie nicht die print in print printAll(dna3.lower()), da es die None am Ende Ihrer Ergebnismenge zeigt (die Funktion hat keinen Rückgabewert).

Mit diesen Modifikationen, meine Ausgabe lautet:

ATGTAA 
ATGAATGACTGATAG 
ATGCTTGTATGCTATGAAAATGTGAAATGACCC 

Hoffe, dass es hilfreich sein werden.

+0

Er möchte alle Teilstrings suchen. Wenn Sie 'start = stop + 3' starten, überspringen Sie einige Teilstrings. – qvpham

+0

@julivico Der zurückgegebene stop-Index ist der Index des ** ersten ** Zeichens der 3-Zeichen-Gruppe, daher meine +3. Deshalb druckt er auch "dna [loc: stop + 3]". – 3kt

+0

Schauen Sie sich den Ausgang 'ATGAATGACTGATAG' an. In dieser Zeichenfolge befindet sich 'ATG'. Wenn Sie 'stop + 3' verwenden, überspringen Sie es. – qvpham

0

Änderungen:

1) min sollte "key = int" verwenden sonst die Sorte wird als String ... wurde

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

2) Pause mit Ausgang ersetzt getan werden, um zu vermeiden Eine andere Schleife mit während

1

Ich denke, Sie hätten es ein bisschen besser erklärt, aber um zu bekommen, was Sie wollen, können Sie nicht die Minute so zurückgeben oder wenn Sie es sonst behandeln müssen. Die langen Ketten, die du bekommst, sind, weil du '60' zurückbringst, was die Länge der ganzen Sequenz ist. Ich habe den Code ein wenig modifiziert und er nimmt nur Sequenzen auf, die auf "tga", "taa" oder "tag" enden.

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

Ausgänge:

ATGTAA 
ATGAATGACTGATAG 
ATGCTATGA 
ATGAAAATGTGA 
ATGTGA 
+0

entfernen Sie die 'print' in' print (printAll (dna3.lower())) 'wird die Ausgabe' None' entfernen. Die Funktion 'printAll' gibt nichts (oder None) zurück. – qvpham

+1

@julivico: Ja, ich habe 3kts Antwort gesehen und dann hat es mich auch getroffen. Vielen Dank! –

0

Änderungsstartflag = loc + 3 bis start = loc + len (Gen) + 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

denke ich, Sie die Ergebnisse nicht wollen, dass Blei die Zeichenfolge bis zum Ende zu drucken, also müssen Sie diese Fälle ausschließen. und eine bessere Nutzung eine for-Schleife für alle Endungen:

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) 

Aber ich denke, was Sie wirklich wollen, ist eine der TGA, TAA und TAG sogar, wenn zu finden zwischen TGA auf einer Position auftritt, dh nicht teilbar durch 3.Dies kann durch reguläre Ausdrücke erfolgen:

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) 

und Ergebnisse in zwei Vorkommen:

ATGTAA 
ATGAATGACTGA 
ATGACTGATAGATATGCTTGTATGCTATGA 
ATGCTTGTATGCTATGAAAATGTGAAATGA 
ATGCTATGA 
ATGAAAATGTGA 
ATGTGA