Daten aus unterschiedlichen Quellen in gemeinsame Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Swordfishtrombones
User
Beiträge: 5
Registriert: Mittwoch 12. November 2008, 13:43

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
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.
Swordfishtrombones
User
Beiträge: 5
Registriert: Mittwoch 12. November 2008, 13:43

Ok, hätte mich auch gewundert wenn das verständlich gewesen wäre. :wink:

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Kleine Anmerkung vorweg

Code: Alles auswählen

for item in itertools.islice(foo, None):
ist die kaum lesbare(und minimal langsamere) Version von:

Code: Alles auswählen

for item in foo:

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]))
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]))
Swordfishtrombones
User
Beiträge: 5
Registriert: Mittwoch 12. November 2008, 13:43

@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 :wink:

Gruss
Thomas
Swordfishtrombones
User
Beiträge: 5
Registriert: Mittwoch 12. November 2008, 13:43

@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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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

Code: Alles auswählen

from itertools import izip
liest dir am besten mal die Doku/Tut zu import durch.
Swordfishtrombones
User
Beiträge: 5
Registriert: Mittwoch 12. November 2008, 13:43

Super!

Danke Euch beiden. Das geht affenschnell und macht genau das was es soll! :D

Gruss
Thomas
Antworten