Problem bei list.append

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
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Hallo.


Ich habe 3 Dateien.
In jeder Datei befinden sich 3 Tabellen, die entweder Tabstop oder Semikolon-Seperiert sind. Außerdem sind noch einige andere Daten angegeben, die jetzt aber unwichtig sind.

Ich lese die Dateien Zeilenweise ein, splite sie, und möchte nun die Zellen der Resultiereneden Listen in eine andere Mehrdimensionale Liste speichern.

Ich stelle mir das so vor:
Eine Liste.
Darin befindet sich für jede Datei eine Liste
Darin befindet sich für jede Tabelle eine Liste
Darin befindet sich für jede Spalte eine Liste
und in letztere soll dann der Wert geschrieben werden.

Das wollte ich wiefolgt realisieren:


Ich habe also eine Liste mit Listen mit Listen mit Werten...

Wenn ich jetzt diesen Befehl eingebe:

mylist[-1][-1][column].append(value)

und column ist beispielsweise 6, value ist beispielsweise 4
erhalte ich bei den Abfragen:

Code: Alles auswählen

print mylist[-1][-1][1]
print mylist[-1][-1][2]
print mylist[-1][-1][...]
print mylist[-1][-1][9]
jeweils die 4 als Ausgabe geliefert.
Dabei sollte es doch nur bei
print mylist[-1][-1][6] sein.
Warum nicht?


lg,
...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie legst Du die Listen an? Vermutlich sind das dieselben Listen!
Was sagt Dir

Code: Alles auswählen

mylist[-1][-1][1] is mylist[-1][-1][2]
?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Wie erstellst du die Listen? Wahrscheinlich mit dem * Operator oder fügst wahrscheinlich in einer Schleife ein und dieselbe Liste immer wieder hinzu, oder? Listen arbeiten nach Referenzen, das darfst du nicht vergessen:

Code: Alles auswählen

In [2]: a = list()

In [3]: b = list()

In [4]: a.append(b)

In [5]: a.append(b)

In [6]: a.append(b)

In [7]: a[0].append(0)

In [8]: a
Out[8]: [[0], [0], [0]]
Mach es eher so:

Code: Alles auswählen

In [9]: a = list()

In [10]: a.append(list())

In [11]: a.append(list())

In [12]: a.append(list())

In [13]: a
Out[13]: [[], [], []]

In [14]: a[0].append(0)

In [15]: a
Out[15]: [[0], [], []]
Achja, Dateien wo Werte mit Kommata oder Semikola getrennt sind nennt man auch csv, die man auch mit einem dementsprechenden Modul parsen kann.

Edit: Meh, zu spät. Bin'n Versager.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Ja, ihr habt recht.

Ich wusste nicht wie Listen tatsächlich ausschaun.
Wie gesagt: ich hatte die Listen mit [[]]*len(columns) erstellt.

Jetzt hab ich das halt in einer For-Schleife mit

Code: Alles auswählen

for foo in columns:
    liste.append([])
erledigt, und jetzt funktioniert es...

Vielen Dank euch!


lg,
...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Alternative wäre:

Code: Alles auswählen

[[] for i in xrange(len(columns))]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Oder:

Code: Alles auswählen

[[] for i in columns]
`xrange` und `len` geben IMHO keine weitere Information, sondern machen es nur schlechter lesbar.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Ach das geht auch?
Da schausch mal, was alles geht...
Bald erfährt man das man Mehrdimensionale Listen/Dics/Arrays/Tupel auch mit SQL-Querys abfragen kann :D (Das wär toll!) -> Gibts für sowas ne API?

Was ist der Vorteil von xrange?
Das würde es doch eh nur bringen, wenn ich nicht jedes Element aus der Liste benötigen würde, oder?
Ansonsten muss ich doch immer die Liste neu berechnen...


lg,
...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, du musst die Liste nicht neu berechnen, `xrange` erstellt nur einen Generator aus seinem Input (hier eben die Laenge deiner `columns`). Nuetzlich ist das nur, wenn dich nur die jeweiligigen Indices interessieren.

Ich finde die Python-Datenstrukturen ja angenehmer als SQL .. aber naja ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

numpy.loadtxt? Oder numpy.fromfile?

'tschudigung, wenn ich so 1-dimensional bin, aber u. U. macht dies das Leben doch einfacher ...
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

xrange([start], stop[, step])¶

This function is very similar to range(), but returns an “xrange object” instead of a list. This is an opaque sequence type which yields the same values as the corresponding list, without actually storing them all simultaneously. The advantage of xrange() over range() is minimal (since xrange() still has to create the values when asked for them) except when a very large range is used on a memory-starved machine or when all of the range’s elements are never used (such as when the loop is usually terminated with break).
... sagt Pydoc.

Wie es hier scheint, muss es die Werte doch jedesmal berechnen, wenn sie benötigt werden.
Ich verstehe das jetzt so: Es wird quasi der Befehl range(x) gespeichert anstelle des resultats daraus.
Darum wird weniger Speicher benötigt.
Bei einem Aufruf wird dann nicht der Eintrag in der Sequenz abgefragt, sondern direkt erst generiert.
Oder hab ich das Falsch verstanden...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

CM hat geschrieben:'tschudigung, wenn ich so 1-dimensional bin, aber u. U. macht dies das Leben doch einfacher ...
...oder das csv Modul, das von BlackVivi schon erwähnt worden ist.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Jo, alles 3 wäre vieleicht ein Blick wert... dann für die nächste Version.

Da ich das ganze für einen Plot in matplotlib benötige ist numpy vieleicht garnicht die schlechteste Variante...

Ich schau mir das mal an, wenn meine anderen Probleme gelöst sind, und ich wieder Zeit dafür habe.


lg,
...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@...: Poste doch mal jeweils einen repräsentativen Ausschnitt aus den Dateien die du einlesen möchtest, dann könnten wir dir ein paar einfache Lösungsansätze geben. Du machst dir vermutlich das Leben gerade unnötig kompliziert.
...
User
Beiträge: 116
Registriert: Mittwoch 23. Dezember 2009, 20:22

Wie gesagt: Momentan funktioniert es soweit.
Das Problem war, das ich die Listen mit * erstellt habe, so das es einfach alles immer die selben Listen waren und blieben, wie sehr ich mich auch mühte, eine einzelne zu ändern.


Ich habe das jetzt mit der oben genannten For-Schleife Realisiert.

Damit hat das Problem jetzt erstmal keine Priorität gegenüber den nächsten.
Wenn es dann allgemein läuft werde ich mich um die Möglichkeiten mit dem CSV-Modul oder den numpy-lösungen kümmern - wenn es mir nicht weiterhilft, dann doch zum Lernen, und zum besseren Verständnis.


Bis hier hin schonmal: Danke euch allen.


lg,
...
Antworten