2013-04-05 3 views
5

ich genetische Signaturen erstellen versuchen. Ich habe eine Textdatei voller DNA-Sequenzen. Ich möchte in jeder Zeile aus der Textdatei lesen. Fügen Sie dann 4mers hinzu, die 4 Basen in einem Wörterbuch enthalten. Zum Beispiel: ProbensequenzSplicing durch eine Leitung einer Text-Datei mit Python

ATGATATATCTATCAT

Was ich will ist hinzuzufügen ATGA, TGAT, GATA, etc .. in ein Wörterbuch mit IDs, die nur um 1 erhöht, während die 4mers Zugabe.

So wird das Wörterbuch halten ...

Genetic signatures, ID 
ATGA,1 
TGAT, 2 
GATA,3 

Hier ist, was ich bisher haben ...

import sys 

def main(): 
    readingFile = open("signatures.txt", "r") 
    my_DNA="" 

    DNAseq = {} #creates dictionary 

    for char in readingFile: 
     my_DNA = my_DNA+char 

    for char in my_DNA:    
     index = 0 
     DnaID=1 
     seq = my_DNA[index:index+4]   

     if (DNAseq.has_key(seq)): #checks if the key is in the dictionary 
      index= index +1 
     else : 
      DNAseq[seq] = DnaID 
      index = index+1 
      DnaID= DnaID+1 

    readingFile.close() 

if __name__ == '__main__': 
    main() 

ist hier meine Ausgabe:

ACTC 
ACTC 
ACTC 
ACTC 
ACTC 
ACTC 

Dieser Ausgang schlägt vor, dass nicht jedes Zeichen in einer Zeichenfolge durchlaufen wird ... bitte helfen!

Antwort

6

Sie benötigen index und DnaID Erklärungen vor der Schleife zu bewegen, sonst werden sie jede Schleifeniterationslatenzzeit zurückgesetzt werden:

index = 0 
DnaID=1 
for char in my_DNA:    
    #... rest of loop here 

Sobald Sie diese Änderung vornehmen, werden Sie diese Ausgabe haben:

ATGA 1 
TGAT 2 
GATA 3 
ATAT 4 
TATA 5 
ATAT 6 
TATC 6 
ATCT 7 
TCTA 8 
CTAT 9 
TATC 10 
ATCA 10 
TCAT 11 
CAT 12 
AT 13 
T 14 

Um die letzten 3 Elemente zu vermeiden, die nicht die richtige Länge haben, können Sie Ihre Schleife ändern:

for i in range(len(my_DNA)-3): 
    #... rest of loop here 
Diese

nicht Schleife durch die letzten 3 Zeichen, so dass die Ausgabe:

ATGA 1 
TGAT 2 
GATA 3 
ATAT 4 
TATA 5 
ATAT 6 
TATC 6 
ATCT 7 
TCTA 8 
CTAT 9 
TATC 10 
ATCA 10 
TCAT 11 
+0

Muchas gracias! Vielen Dank, Sie rocken! – brooklynchick

1

index ist wird auf 0 zurückgesetzt, jedes Mal durch die Schleife, die mit for char in my_DNA: beginnt.

Außerdem glaube ich, die Schleifenbedingung so etwas wie while index < len(my_DNA)-4: mit der Schleife in Einklang stehen soll.

+0

Vielen Dank, hun! – brooklynchick

+0

@brooklynchick: Ich bin froh zu helfen. Ich schlage vor, dass Sie die Antwort auswählen, die am hilfreichsten war, und kreuzen Sie diese Antwort an, um zu zeigen, dass Sie sie akzeptiert haben. Wenn Sie sich nicht sicher sind, welchen Sie ankreuzen sollten, würde ich Ihnen die Antwort von c4p vorschlagen, weil sie für mich die vollständigste ist. – Simon

+0

Danke Simon. Wie ticke ich? Dies ist das erste Mal, dass ich eine Frage zu Stackoverflow gestellt habe. – brooklynchick

1

Ihr Indexzähler selbst zurückgesetzt, da sie in der for-Schleife sind.

Darf ich einige weitere Vorschläge zu machen? Meine Lösung würde so aussehen:

readingFile = open("signatures.txt", "r") 
my_DNA="" 

DNAseq = {} #creates dictionary 

for line in readingFile:  
    line = line.strip() 
    my_DNA = my_DNA + line 

ID = 1 
index = 0 
while True: 

    try: 
     seq = my_DNA[index:index+4] 
     if not seq in my_DNA: 
      DNAseq[ID] = my_DNA[index:index+4] 
     index += 4 
     ID += 1 
    except IndexError: 
     break 

readingFile.close() 

Aber was möchten Sie mit Duplikaten tun? Z. B. wenn eine Sequenz wie ATGC zweimal erscheint? Sollten beide unter einer anderen ID hinzugefügt werden, zum Beispiel {...1:'ATGC', ... 200:'ATGC',...} oder sollen diese weggelassen werden?

+0

Danke Jungs, ich habe es zu arbeiten .. einfache Lösung .. @ Bluewood ... Ich habe eine if else-Anweisung, die die Sequenzen (Schlüssel) im Wörterbuch überprüft und wenn es bereits drin ist, ich füge es nicht in die Wörterbuch. Wenn es nicht im Wörterbuch ist, dann füge ich es hinzu – brooklynchick

+0

Warum würde deine while-Schleife wahr sein? wäre es nicht eine Bedingung? – brooklynchick

+0

Ich denke, das ist ein guter Weg, um etwas zu durchlaufen, das eine variable Länge hat und wenn eine while-Schleife mehr machbar erscheint als eine for-Schleife. In diesem Fall würde die Schleife bis zum letzten 4mer laufen. –

0

Wenn ich richtig zu verstehen, Sie zählen, wie oft jede sequentielle Kette von 4 Basen auftritt?Versuchen Sie folgendes:

def split_to_4mers(filename): 
    dna_dict = {} 
    with open(filename, 'r') as f: 
     # assuming the first line of the file, only, contains the dna string 
     dna_string = f.readline(); 
     for idx in range(len(dna_string)-3): 
      seq = dna_string[idx:idx+4] 
      count = dna_dict.get(seq, 0) 
      dna_dict[seq] = count+1 
    return dna_dict 

Ausgabe auf eine Datei, die nur "ATGATATATCTATCAT" enthält:

{'TGAT': 1, 'ATCT': 1, 'ATGA': 1, 'TCAT': 1, 'TATA': 1, 'TATC': 2, 'CTAT': 1, 'ATCA': 1, 'ATAT': 2, 'GATA': 1, 'TCTA': 1} 
+0

Danke, ich werde weiter daran arbeiten :) – brooklynchick

2

Dies sollte Ihnen den gewünschten Effekt.

from collections import defaultdict 

readingFile = open("signatures.txt", "r").read() 
DNAseq  = defaultdict(int) 
window  = 4 

for i in xrange(len(readingFile)): 
    current_4mer = readingFile[i:i+window] 
    if len(current_4mer) == window: 
     DNAseq[current_4mer] += 1 

print DNAseq 
Verwandte Themen