2017-01-25 2 views
0

I eine file1 haben muss Region Informationen wie Chromosom 1 von Position 1 bis Position 10, wie folgt aussieht: chromosome,start_position,end_position 1,1,10 1,11,20 Wie kann ich alle Schlüsselwerte hinzufügen und das neue Wörterbuch drucken?

A file2 Werte für jede Position, wie Position 6 auf Chromosom 1 mit einem gewissen Wert, wie folgt aussieht: chromosome,position,value 1,1,value1 1,2,value2 1,6,value3 1,13,value4

ich möchte file2 Werte hinzufügen, in Datei1 basierend darauf, ob Positionen in Datei2 in jeder beliebigen Region file1 gehört, so etwas wie: chromosome,start_position,end_position,total_value 1,1,10,value1+value2+value3 1,11,20,value4

Beide Dateien können mehr als 10 m betragen Illion-Zeilen, Soll ich dies tun, indem ich durch jede Zeile von Datei2 schaue (um zu sehen, ob die Position in irgendeinem Bereich von Datei1 ist), oder jede Zeile von Datei1 zu einem Wörterbuch machen (dann Wert in Datei2 finden? dann füge hinzu?)?

Und wie kann ich den "Gesamtwert" jeder Zeile in Datei1 bekommen? Danke allen!

+0

Willkommen bei Stack Overflow! Sie können [die Tour] (http://stackoverflow.com/tour) zuerst und lernen [Wie man eine gute Frage stellt] (http://stackoverflow.com/help/how-to-ask) und erstellen Sie eine [ Minimal, vollständig und verifizierbar] (http://stackoverflow.com/help/mcve) Beispiel. Das erleichtert es uns, Ihnen zu helfen. –

+0

Diese Frage macht nicht klar, wie Sie 'file1' und' file2' kombinieren müssen. –

+0

Ich mag den Wörterbuchansatz. Es wird mehrere Gigs verbrauchen, aber wenn deine Maschine halbwegs in Ordnung ist, ist das keine große Sache. Sie sparen Speicher, wenn Sie den Schlüssel mit einem String wie "1,1,10" belegen können, anstatt ihn in ein Tupel zu zerlegen. – tdelaney

Antwort

0

Ich nehme an, dass Sie nicht unbedingt nach dem effizientesten Code suchen, aber einer, der die Aufgabe erfüllt?

Ich würde die Werte in Datei 2 in ein Wörterbuch lesen, wobei der Schlüssel ein (chromosome, start) Paar wäre (vorausgesetzt, dass Anfang und Ende in Datei 2 immer gleich sind).

Dann lesen Sie die Datei 1 Zeile-für-Zeile, und alle relevanten Werte in der „Datei 2“ Wörterbuch finden, die sich ergebende Summe zum Ende der Leitung (wahrscheinlich in einer neuen Datei) anhängt:

import numpy as np 

for line in file1: 
    chromosome, start, end = line.split(',') 
    total_value = np.sum([file2_dict.get([(chromosome,str(i))], 0) for i in 
          range(int(start), int(end)+1)]) 
    #do something with the total value, maybe write to another file. 
    #Could do: 
    new_line = ','.join([chromosome, start, end, total_value]) + '\n' 

Ich überlasse Ihnen den Rest der Implementierungsdetails (z. B. das Abrufen Ihres Wörterbuchs aus Datei 2). Es könnte ein bisschen schwer auf Speicherverbrauch sein, aber hoffentlich nicht so schlecht.

Beachten Sie die Verwendung der Methode .get() mit der Wörterbuchsuche - dadurch wird sichergestellt, dass alle Schlüssel, die nicht im Wörterbuch gefunden werden, 0 zurückgeben. Sie entscheiden, ob das für Ihre Situation funktioniert. Beachten Sie auch die Verwendung von str und int, um zwischen Text und Zahlen zu konvertieren. Sie entscheiden, ob dies aufgrund Ihrer Implementierung angemessen ist.

Auch, wenn Sie Python-Listen-Comprehensions zuvor noch nicht gefunden haben, tun Sie etwas Forschung darüber. So können wir den One-Liner schreiben, um die Summe aller relevanten Werte zu erhalten.

+0

Vielen Dank für Ihre Hilfe! – kelloggs

Verwandte Themen