2016-04-13 8 views
0

Ich habe 3 Dateien (file1.txt, file2.txt, file3.txt), die wie folgt aussehen:align Arrays mit Python

file1:

-7 12 
-6 13 
-5 11 
-4 10 
-3 4 
-2 8 
-1 7 
0 9 
1 10 

file2:

-5 13 
-4 4 
-3 5 
-2 4 
-1 7 
0 6 
1 9 
2 10 
3 2 

file3:

-2 3 
-1 14 
0 8 
1 7 
2 3 
3 9 
4 10 
5 8 
6 3 

Ich möchte die Nullen der Arrays auszurichten ich aus diesen Dateien und erhalten Sie die Summe der Werte auf der rechten Seite zu lesen, das ist immer so etwas wie:

-7 -> 12 + 0 + 0 = 12 
-6 -> 13 + 0 + 0 = 13 
-5 -> 11 + 13 + 0 = 24 
-4 -> 10 + 4 + 0 = 14 
-3 -> 4 + 5 + 0 = 9 
-2 -> 8 + 4 + 3 = 15 
-1 -> 7 + 7 + 14 = 28 
0 -> 9 + 6 + 8 = 23 
1 -> 10 + 9 + 7 = 26 
2 -> 0 + 10 + 3 = 13 
3 -> 0 + 2 + 9 = 11 
4 -> 0 + 0 + 10 = 10 
5 -> 0 + 0 + 8 = 8 
6 -> 0 + 0 + 3 = 3 
7 -> 0 + 0 + 0 = 0 

Wie ich das könnte, mit Python? Vielen Dank im Voraus.

+0

hast du irgendwas probiert? – gidim

+0

Ich fühle mich ein wenig beschämt, aber ich habe keine Ideen ... – urgeo

+0

Wissen Sie, wie man Werte aus einer Datei liest oder stecken Sie darauf fest? –

Antwort

0

Von Anfang bis Ende, vorausgesetzt, die beabsichtigte Ausgabe ist csv, sowie die Eingabedateien sind csv durch "," abgegrenzt. Ausgabemethoden sind jedoch sehr flexibel, wenn etwas anderes erwartet wurde.

import petl 

file1 = petl.fromcsv('file1.csv') 
file1 = petl.pushheader(file1, ['position', 'value1']) 
file2 = petl.fromcsv('file2.csv') 
file2 = petl.pushheader(file2, ['position', 'value2']) 
file3 = petl.fromcsv('file3.csv') 
file3 = petl.pushheader(file3, ['position', 'value3']) 


file1_joined_file2 = petl.outerjoin(file1, file2, key='position') 
all_joined = petl.outerjoin(file1_joined_file2, file3, key='position') 
all_joined = petl.convert(all_joined, 'value1', {None: 0}) 
all_joined = petl.convert(all_joined, 'value2', {None: 0}) 
all_joined = petl.convert(all_joined, 'value3', {None: 0}) 
all_joined = petl.convert(all_joined, ('position', 'value1', 'value2', 'value3'), int) 
all_joined = petl.addfield(all_joined, 'sum', lambda rec: rec['value1'] + rec['value2'] + rec['value3']) 
all_joined = petl.sort(all_joined, 'position') 

print petl.lookall(all_joined) 
petl.tocsv(all_joined, 'done.csv') 

Ausgabe aus dem Druck oben:

+----------+--------+--------+--------+-----+ 
| position | value1 | value2 | value3 | sum | 
+==========+========+========+========+=====+ 
|  -7 |  12 |  0 |  0 | 12 | 
+----------+--------+--------+--------+-----+ 
|  -6 |  13 |  0 |  0 | 13 | 
+----------+--------+--------+--------+-----+ 
|  -5 |  11 |  13 |  0 | 24 | 
+----------+--------+--------+--------+-----+ 
|  -4 |  10 |  4 |  0 | 14 | 
+----------+--------+--------+--------+-----+ 
|  -3 |  4 |  5 |  0 | 9 | 
+----------+--------+--------+--------+-----+ 
|  -2 |  8 |  4 |  3 | 15 | 
+----------+--------+--------+--------+-----+ 
|  -1 |  7 |  7 |  14 | 28 | 
+----------+--------+--------+--------+-----+ 
|  0 |  9 |  6 |  8 | 23 | 
+----------+--------+--------+--------+-----+ 
|  1 |  10 |  9 |  7 | 26 | 
+----------+--------+--------+--------+-----+ 
|  2 |  0 |  10 |  3 | 13 | 
+----------+--------+--------+--------+-----+ 
|  3 |  0 |  2 |  9 | 11 | 
+----------+--------+--------+--------+-----+ 
|  4 |  0 |  0 |  10 | 10 | 
+----------+--------+--------+--------+-----+ 
|  5 |  0 |  0 |  8 | 8 | 
+----------+--------+--------+--------+-----+ 
|  6 |  0 |  0 |  3 | 3 | 
+----------+--------+--------+--------+-----+ 
1

nur eine Idee, aber es würde viel sie sein:

  1. Importe all diese Paare in eine Liste von Paaren
  2. erstellen eine zweite leere Liste von Paaren
  3. parsen jedes Paar der ersten Liste und prüfen, ob die erste el Das Paar ist irgendwo unter den ersten Elementen der Paare der zweiten Liste. Wenn es bereits ist, summiere dann das zweite Element der Paare, ansonsten füge das Paar einfach der zweiten Liste hinzu.