Seite 1 von 1
Daten aus unterschiedlichen Quellen in gemeinsame Liste
Verfasst: Donnerstag 20. November 2008, 12:07
von Swordfishtrombones
Moin,
ich bin mit meinem Verständnis von Python noch nicht so weit und habe daher eine wahrscheinlich recht triviale Frage.
Wie bekomme ich Einzelwerte, die aus diversen Liste per Iterationen ausgelesen werden in eine gemeinsame Liste geschrieben?
Ich habe diverse Variablen die allesamt Listen verkörpern. Diese werden auseinander gerupft und zur Zeit durch \n in jeweil eine eigene Zeile geschrieben.
Dadurch erhalte ich ja quasi Spalten. Die "Spalten" würde ich aber halt gern so miteineander verbinden, das ich eine Matrix erhalte in der erst die erste Spalte, dann die zweite usw. kommt. Dabei muss der erste Ausdruck der zweiten Spalte aber auch an zweiter Stelle in der ersten Zeile der resultierenden Matrix erscheinen.
Wie bekomme ich das hin?
Vielen Dank,
Thomas
Verfasst: Donnerstag 20. November 2008, 12:15
von BlackJack
Bitte das Problem noch einmal genauer beschreiben. Vielleicht mit einem Beispiel wie die Daten ausehen, was Du bisher an Code hast, und wie das Ergebnis aussehen soll.
Verfasst: Donnerstag 20. November 2008, 13:19
von Swordfishtrombones
Ok, hätte mich auch gewundert wenn das verständlich gewesen wäre.
Ich benötige Daten aus einem HDF5 Dokument, welches ich unter Verwendung von numpy und pytables einlese. Mit den itertools zerlege ich dann die Listenstruktur. Das HDF5 Dokument besteht vollständig aus Tabellen und diese werden mir durch pytables als Listen mit jeder Menge Listen darin (1645 um genau zu sein) ausgegeben.
Code: Alles auswählen
import tables, numpy, os, math, sys, itertools
filename = r"OMI-Aura_L2-OMDOMINO_2008m1015t1201-o22619_v003-2008m1017t131859.he5"
swathname = "DominoNO2"
hdf5file = tables.openFile(filename, mode = "r", rootUEP = "HDFEOS/SWATHS/" + swathname)
geo = hdf5file.getNode("/", "Geolocation Fields")
lat = geo.Latitude.read()
long = geo.Longitude.read()
# latitude
latf = open("latitude.txt", "w")
for latslice in itertools.islice(lat, None):
for latcol in itertools.islice(latslice, None):
latf.write( str(latcol) + '\n')
latf.close()
# longitude
longf = open("longitude.txt", "w")
for longslice in itertools.islice(long, None):
for longcol in itertools.islice(longslice, None):
longf.write( str(longcol) + '\n')
longf.close()
Wie hier ja deutlich wird, schreibe ich z.Z. die Werte in Textdateien. Ich benötige aber eigentlich eine Liste in Python, die den ersten Wert von Latitude in der ersten Zeile an der ersten Stelle hat und den ersten Wert von Longitude in der ersten Zeile an der zweiten Stelle hat. Danach soll ein Zeilenumbruch erfolgen und das zweite Wertepaar geschrieben werden.
Ich hoffe das ist jetzt ein wenig mehr aufschlussreich.
Danke
Thomas
Verfasst: Donnerstag 20. November 2008, 13:33
von Darii
Kleine Anmerkung vorweg
ist die kaum lesbare(und minimal langsamere) Version von:
Wenn ``lat`` und ``long`` normale Listen sind und ich dein Problem richtig verstanden habe, würde ich es so machen:
Code: Alles auswählen
long_lat = open("both", "w")
for i in xrange(min(len(lat), len(long))):
long_lat.write( "%s %s\n" % (lat[i][0], long[i][0]))
Verfasst: Donnerstag 20. November 2008, 14:03
von BlackJack
Oder ohne Index mit `itertools.izip()`:
Code: Alles auswählen
for latitude, longitude in izip(latitudes, longitudes):
long_lat_file.write('%s %s\n' % (latitude[0], longitude[0]))
Verfasst: Donnerstag 20. November 2008, 14:09
von Swordfishtrombones
@Darii
Kommt darauf an, was du unter einer normalen Liste verstehst.
long und auch lat sehen quasi so aus:
[[value,value, value, value, value, value, value]
[value, value, value, value, value, value, value]
[value, value, value, value, value, value, value]
...]
Daher meine Umschreibung mit viele Listen in einer Liste.
Ansonsten versuche ich deinen Code zu verstehen
Gruss
Thomas
Verfasst: Donnerstag 20. November 2008, 14:37
von Swordfishtrombones
@BlackJack
Die Geschichte mit dem izip finde ich ja ziemlich fluffig, leider komme ich mit dem Code so wie du ihn geschrieben hast nicht hin. Ich muss immer 'itertools.izip' schreiben. Sonst ist er der Meinung das izip nicht definiert ist. Vielleicht habe ich das Prinzip mit den Listen noch nicht so richtig verstanden, denn der folgende Code funktioniert nicht:
Code: Alles auswählen
long_lat = open("test", "w")
for ListLat, ListLong in itertools.izip(lat, long):
for StrLat, StrLong in itertools.izip(ListLat, ListLong):
long_lat.write('%s %s\n' % (StrLat[0], StrLong[0]))
Die Fehlermeldung ist: IndexError: invalid index to scalar variable.
Thomas
Verfasst: Donnerstag 20. November 2008, 14:55
von Darii
Swordfishtrombones hat geschrieben:Kommt darauf an, was du unter einer normalen Liste verstehst.
Eine normale Liste ist einfach eine normale liste oder verhält sich so. In diesem Fall: Man kann über foo[index] auf die einzelnen Elemente zugreifen.
Streich einfach die 2. For-Zeile. Da ListLat und ListLong deiner Beschreibung nach nur ein Element haben kannst du auch direkt über ListLat[0] darauf zugreifen und musst nicht erst darüber iterieren.
Um direkt auf izip ohne itertools zugreifen zu können brauchst du
liest dir am besten mal die Doku/Tut zu import durch.
Verfasst: Donnerstag 20. November 2008, 15:16
von Swordfishtrombones
Super!
Danke Euch beiden. Das geht affenschnell und macht genau das was es soll!
Gruss
Thomas