verschachtelte Liste, Unterpunkt abfragen

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
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 26. August 2008, 13:14

Hallo Zusammen,

als python Noob habe ich mir schon schwer getan das System der Liste zu verstehen.
Gesucht hatte ich nach einer Art mehrdimensionalem Array.

Meine Lösung scheint aber schon recht praktikabel:

Code: Alles auswählen

# Verschachtelung
a = ["1", "2", "wichtiger Wert"]
b = ["a", "b", "c"]
ab = ["a1", "b3", "c1"]
liste = [a, b, ab]

for i in liste:
	print i
Allerdings komme ich beim besten Willen nicht darauf, wie ich die Listen jetzt miteinander verknüpft benutzen kann. Besser gefragt, wie komme ich an alle 3 Werte z.B. an der Stelle 2?
Oder wie komme ich an den wichtigen Wert in meiner verschachtelten Liste.
Wäre total nett wenn mir jemand einen Hinweis geben könnte.

Leider bin ich auch an python 2.2.1 gebunden und der Dokudazu. In dieser konnte ich solche simplen Sachen nicht finden. Vielleicht hat jemand eine Ahnung wo ich das finden kann.

Danke. :D
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 26. August 2008, 13:24

andilar hat geschrieben:wie komme ich an alle 3 Werte z.B. an der Stelle 2?
Ich verstehe nicht, was du damit meinst/
Oder wie komme ich an den wichtigen Wert in meiner verschachtelten Liste.

Code: Alles auswählen

liste[0][2]  # ergibt: "wichtiger Wert"
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 26. August 2008, 13:30

Rebecca hat geschrieben:
Oder wie komme ich an den wichtigen Wert in meiner verschachtelten Liste.

Code: Alles auswählen

liste[0][2]  # ergibt: "wichtiger Wert"
Vielen Dank!
Rebecca hat geschrieben:
andilar hat geschrieben:wie komme ich an alle 3 Werte z.B. an der Stelle 2?
Ich verstehe nicht, was du damit meinst/
Wahrscheinlich müsste das dann so etwas sein wie:

Code: Alles auswählen

liste[0][2]
liste[1][2]
liste[2][2]
in einem Befehl. Mit dem was du geschrieben hast komme ich aber auch schon weiter.
Zuletzt geändert von andilar am Dienstag 26. August 2008, 14:31, insgesamt 1-mal geändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 26. August 2008, 14:01

andilar hat geschrieben: Wahrscheinlich müsste das dann so etwas sein wie:

Code: Alles auswählen

liste[0][2]
liste[1][2]
liste[2][2]
[/code]
in einem Befehl.
Richtig. Kannst natuerlich eine for-Schleife fuer den ersten Index verwenden. Oder eine LIst Comprehension:

Code: Alles auswählen

a = [zeile[2] for zeile in liste] # -> [3, 6, 9]
Eventuell ist auch das Scipy-Array was fuer dich:

Code: Alles auswählen

In [3]: a = scipy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

In [4]: a[1]
Out[4]: array([4, 5, 6])

In [5]: a[1, 2]
Out[5]: 6

In [6]: a[1, :]
Out[6]: array([4, 5, 6])

In [7]: a[:, 1]
Out[7]: array([2, 5, 8])
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

Dienstag 26. August 2008, 14:03

Wenn man nicht an so antike Python-Versionen gebunden ist, gäbe es noch `operator.itemgetter()`:

Code: Alles auswählen

In [54]: import operator

In [55]: map(operator.itemgetter(2), liste)
Out[55]: ['wichtiger Wert', 'c', 'c1']
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Dienstag 26. August 2008, 14:05

Rebecca hat geschrieben:
andilar hat geschrieben:wie komme ich an alle 3 Werte z.B. an der Stelle 2?
Ich verstehe nicht, was du damit meinst/

Code: Alles auswählen

for i in liste:
    print i[1]
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 26. August 2008, 14:16

Rebecca hat geschrieben: Richtig. Kannst natuerlich eine for-Schleife fuer den ersten Index verwenden. Oder eine LIst Comprehension:

Code: Alles auswählen

a = [zeile[2] for zeile in liste] # -> [3, 6, 9]
So etwas habe ich schon ein paar mal im Forum gelesen, aber beim Besten willen nicht verstanden was dort passiert.
Ich denke so langsam leuchtet es mir ein, ich nehme zeile 3 aus der For Schleife rechts stehend... oder?
Rebecca hat geschrieben: Eventuell ist auch das Scipy-Array was fuer dich:

Code: Alles auswählen

In [3]: a = scipy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

In [4]: a[1]
Out[4]: array([4, 5, 6])

In [5]: a[1, 2]
Out[5]: 6

In [6]: a[1, :]
Out[6]: array([4, 5, 6])

In [7]: a[:, 1]
Out[7]: array([2, 5, 8])
Das sieht interessant aus, schau ich mir mal an
BlackJack hat geschrieben:Wenn man nicht an so antike Python-Versionen gebunden ist, gäbe es noch `operator.itemgetter()`:

Code: Alles auswählen

In [54]: import operator

In [55]: map(operator.itemgetter(2), liste)
Out[55]: ['wichtiger Wert', 'c', 'c1']
Tja das treibt mich auch in den Wahnsinn, aber leider bin ich an die Vorgabe gebunden.
würmchen hat geschrieben:

Code: Alles auswählen

for i in liste:
    print i[1]
ganz genau das, Danke
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 26. August 2008, 14:51

andilar hat geschrieben:
Rebecca hat geschrieben:

Code: Alles auswählen

a = [zeile[2] for zeile in liste] # -> [3, 6, 9]
So etwas habe ich schon ein paar mal im Forum gelesen, aber beim Besten willen nicht verstanden was dort passiert.
Die analoge Schreibweise ohne List Comprehension:

Code: Alles auswählen

a = []
for zeile in liste:
    a.append(zeile[2])
Klarer? Mit List Comprehensions kannst du halt sehr bequem neue Listen erzeugen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Dienstag 26. August 2008, 15:00

Rebecca hat geschrieben: Die analoge Schreibweise ohne List Comprehension:

Code: Alles auswählen

a = []
for zeile in liste:
    a.append(zeile[2])
Klarer? Mit List Comprehensions kannst du halt sehr bequem neue Listen erzeugen.
Okay verstanden, aber warum sollte ich eine Liste erzeugen mit einem einzigen Wert darin? Also warum gibt es List Comprehension (was sich schonmal sehr wichtig anhört)?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 26. August 2008, 15:07

Nein, in deinem Beispiel erhaeltst du eine Liste mit drei werten, eben die drei Werte, die in der letzten "Spalte" stehen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
snafu
User
Beiträge: 5496
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 26. August 2008, 16:03

Ich habe mir LC so beigebracht (weiss natürlich nicht, ob meine Logik auch für andere verständlich ist) : Am Anfang steht die Variable, die zur Liste hinzugefügt werden soll, aber ohne das append() drumrum - also so gesehen: das, was ich am Ende der ganzen Verschachtelungen zum Hinzufügen habe. Und alles, was danach kommt, kann man im Prinzip auch so lesen, als würde es untereinander mit den entsprechenden Einrückungen stehen. Es steht also alles in einer Zeile und du sparst dir die Zeile mit der leeren Liste, da diese ja gleich miterstellt wird. Ich finde das besonders praktisch als Rückgabewert von Funktionen. :)
DasIch
User
Beiträge: 2462
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dienstag 26. August 2008, 16:13

Ich denke man kann LC und GenExp besser verstehen wenn man daraus einfach mal einen Satz in einer echten Sprache macht.

Code: Alles auswählen

[foo for foo in bar]
#do foo for foo in bar
#mache foo für jedes foo in bar
Bei eckigen Klammern wird eine Liste erzeugt gefüllt mit ``foo``s andernfalls sieht man ja was passiert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Dienstag 26. August 2008, 16:41

Fuer die Mathematiker unter uns finde ich den Vergleich mit der Mengen-Notationen auch nett:

A = {x_2 | x ∈ X}

Code: Alles auswählen

A = [x[2] for x in X]
A = {x | x ∈ X und x >0}

Code: Alles auswählen

A = [x for x in X if x>0]
A = {x^2 | x ∈ {1, 2, 3, 4, 5}}

Code: Alles auswählen

A = [x**2 for x in [1, 2, 3, 4, 5]]
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dienstag 26. August 2008, 16:59

DasIch hat geschrieben:Ich denke man kann LC und GenExp besser verstehen wenn man daraus einfach mal einen Satz in einer echten Sprache macht.

Code: Alles auswählen

[foo for foo in bar]
#do foo for foo in bar
#mache foo für jedes foo in bar
Bei eckigen Klammern wird eine Liste erzeugt gefüllt mit ``foo``s andernfalls sieht man ja was passiert.
Hmm nein so ganz stimmt das nicht.
Eher: Hänge jeden Wert `foo' in der Sequenz `bar' an eine leere Liste.

Ein wenig umständlich, aber man macht ja nichts in dem Fall ;)
Ich stimme aber auf jeden Fall mit dir überein, dass man es mit nem echten Satz am besten versteht.
andilar
User
Beiträge: 19
Registriert: Montag 4. August 2008, 09:25
Wohnort: Braunschweig

Mittwoch 27. August 2008, 07:59

Nun, mir ist aber schon einiges klarer. :)
Antworten