Seite 1 von 1

verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 13:14
von andilar
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

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 13:24
von Rebecca
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"

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 13:30
von andilar
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.

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 14:01
von Rebecca
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])

Verfasst: Dienstag 26. August 2008, 14:03
von BlackJack
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']

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 14:05
von würmchen
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]

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 14:16
von andilar
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

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 14:51
von Rebecca
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.

Re: verschachtelte Liste, Unterpunkt abfragen

Verfasst: Dienstag 26. August 2008, 15:00
von andilar
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)?

Verfasst: Dienstag 26. August 2008, 15:07
von Rebecca
Nein, in deinem Beispiel erhaeltst du eine Liste mit drei werten, eben die drei Werte, die in der letzten "Spalte" stehen.

Verfasst: Dienstag 26. August 2008, 16:03
von snafu
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. :)

Verfasst: Dienstag 26. August 2008, 16:13
von DasIch
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.

Verfasst: Dienstag 26. August 2008, 16:41
von Rebecca
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]]

Verfasst: Dienstag 26. August 2008, 16:59
von cofi
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.

Verfasst: Mittwoch 27. August 2008, 07:59
von andilar
Nun, mir ist aber schon einiges klarer. :)