2016-12-13 20 views
-2

Dieser Code sollte alle codierenden Sequenzen in einer größeren Sequenz namens Sequentie drucken. Es wird jedoch die erste gefundene Sequenz unendlich gedruckt.Der Code wird nicht richtig durchgeschleift

def getCodons(sequentie): 
    DNA = sequentie 
    while 'atg' in DNA: 
     start = DNA.find('atg') 
     codon = getSequentie(DNA, start) 
     DNA = DNA[DNA.index(codon):] 


def getSequentie(DNA, start): 
    print ('') 
    print ("Sequentie:") 
    while start+2 < len(DNA): 
      codon = DNA[start:start+3] 
      if codon == "tag" or codon == "taa" or codon == "tga": 
       print (codon, end=' ') 
       return codon 
       break 
      print (codon, end=' ') 
      start+=3  

So Ausgabe:

Sequentie: atg aag ttt ttg gta gtt AAG ata AAG ctc gag Akt gat att TCA tat Akt GGA tga tga

Sequentie: atg aag ttt ttg gta gtt AAG ata AAG ctc gag Akt gat att TCA tat Akt gGA tga tga

Sequentie: atg aag ttt ttg gta gtt AAG ata AAG ctc gag Akt gat att TCA tat Akt GGA tga tga

Sequentie: atg aag ttt ttg gta gtt AAG ata AAG ctc gag Akt gat att TCA tat Akt GGA tga tga ...

für die sequentie ccagaatggttactatggacatccgccaaccatacaagctatggtgaaatgctttatctatctcatttttagtttcaaagcttttgttataacacatgcaaatccatatccgtaaccaatatccaatcgcttgacatagtctgatgaagtttttggtagttaagataaagctcgagactgatatttcatatactggatgatttagggaaacttgcattctattcatgaacgaatgagtcaatacgagacacaaccaagcatgcaaggagctgtgagttgatgttctatgctatttaagtatttttcgggagatatatatatcttattgttctcctcctcccgagtcaagttgttctaagaaagaaggatctatttcattttgtggattgtctagtttcagggacagacggggtttaggggaagcgctatccgtggctgctatgacatcgaagaaactctgcacgacatggtat gtaatct

I Sequentie erhalten möchten: atg aag ttt ttg gta gtt AAG ata AAG ctc gag Akt gat att TCA tat Akt GGA tga tga

und dann die nächste Sequenz gefunden

+2

können Sie bitte einen Beispiel-Eingang und Ihre erwartete Ausgabe hinzufügen – Kidus

+0

In 'getCodons' möchten Sie wahrscheinlich DNA = DNA [DNA.Index (Codon) +1:]' –

+0

Können Sie bitte ein konkretes Beispiel eingeben und die erwartete Ausgabe? Der Zweck des Codes ist schwer anders zu erhalten. BTW, ich glaube, du musst 'start + = 4' anstelle von' start + = 3' schreiben – Iarwa1n

Antwort

0

Das Hauptproblem ist, dass Sie dieselbe Instanz von "atg" in Ihrer äußeren Schleife finden. Dies liegt daran, dass getSequentie eine Zeichenfolge zurückgibt, die immer mit "atg" beginnt. Und so wird in der nächsten Iteration der Schleife starten wird 0 (die DNA Zeichenfolge beginnt mit "atg"). Von diesem Moment an DNA.index(codon) wird immer Null ergeben, und so ändert sich nichts in der nächsten Iteration, was zu der Endlosschleife führt.

Man könnte dies durch Zugabe von 1 hier lösen:

DNA = DNA[DNA.index(codon)+1:] 

Auf diese Weise DNA wird immer kürzer wird, und so wird das Looping endlich sein.

Sie sollten auch definieren, was Sie wollen, wenn das Endcodon nicht gefunden wird. Die zweite Funktion wird None in diesem Fall zurückgeben, und die erste Funktion sollte damit umgehen (es sollte beendet werden). Wahrscheinlich sollte die Sequenz in diesem Fall nicht einmal gedruckt worden sein.

Es ist besser, den Druck zu verzögern, bis Sie die endgültigen Ergebnisse haben. Die zweite Funktion könnte den Index zurückgeben, wo die Sequenz endet (oder None, wenn das Endcodon nicht gefunden wurde). Dann könnten Sie eine Ergebnisvariable mit den Sequenzen füllen und den Druck dem Aufrufer überlassen.

Hier ist der Code, nachdem diese und einige andere Änderungen Anwendung:

def getCodons(sequentie): 
    DNA = sequentie 
    start = 0 
    codons = [] 
    while 'atg' in DNA: 
     start = DNA.find('atg', start) 
     end = getSequentie(DNA, start) 
     if not end: 
      break 
     codons.append(' '.join([DNA[i:i+3] for i in range(start, end, 3)])) 
     start = end 
    return codons 


def getSequentie(DNA, start): 
    for start in range(start, len(DNA)-2, 3): 
     if DNA[start:start+3] in ("tag", "taa", "tga"): 
      return start+3 

sequences = getCodons('ccagaatggttactatggacatccgccaaccatacaagctatggtgaaatgctttatctatctcatttttagtttcaaagcttttgttataacacatgcaaatccatatccgtaaccaatatccaatcgcttgacatagtctgatgaagtttttggtagttaagataaagctcgagactgatatttcatatactggatgatttagggaaacttgcattctattcatgaacgaatgagtcaatacgagacacaaccaagcatgcaaggagctgtgagttgatgttctatgctatttaagtatttttcgggagatatatatatcttattgttctcctcctcccgagtcaagttgttctaagaaagaaggatctatttcattttgtggattgtctagtttcagggacagacggggtttaggggaagcgctatccgtggctgctatgacatcgaagaaactctgcacgacatggtatgtaatct') 

print('\n'.join(sequences)) 

Sehen Sie es auf repl.it laufen.