dreidimensionale Listen ohne verschachtelte for Schleifen?

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
seson
User
Beiträge: 1
Registriert: Montag 4. Juni 2007, 22:04

Montag 4. Juni 2007, 22:10

Hallo Leute,

ich habe ein dreidimensionales Array (d.h. eine Liste) und möchte alle Werte einsammeln, die in der dritten Dimension zu allen Werten von 1. und 2. Dimension gespeichert sind.

Beispiel:

Werte[x][y][z]

Und ich will in einer Liste alle Werte haben, wo x und y beliebig und z = 5 ist.

Mit for-Schleifen sieht das so aus:

Code: Alles auswählen

for x in Werte:
  for y in x:
    print y[5]
Das muss doch einfacher gehen oder?

In meinem Szenario handelt es sich zwar um ein Dictionary, aber ich denke das läuft auf's Gleiche hinaus.

Gruß,
Sebastian
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Montag 4. Juni 2007, 23:13

Code: Alles auswählen

data = [[['1', '2'], ['3', '4']], [['5', '6'], ['7', '8']]]
map(lambda e: map(lambda ee: sys.stdout.write(ee[0]+"\n"), e), data)
1
3
5
7
;)

Ob das nun wirklich hübscher ist wage ich zu bezweifeln..

Edit:
Als List Comprehension

Code: Alles auswählen

[[sys.stdout.write(ee[0]) for ee in e] for e in data]
[/code]

Damit sparst du zwar 2 Zeilen Code aber leserlicher/schöner wird es dadurch meiner Meinung nach nicht.
BlackJack

Montag 4. Juni 2007, 23:50

Beide Lösungen sind nicht schön, weil Listen erstellt werden, die gar nicht verwendet werden. `map()` und "list comprehension" sollte man dafür nicht missbrauchen, sondern nur, wenn wirklich eine Liste erzeugt werden soll, die danach auch verwendet wird.

Zur Frage: Nein, wie sollte das einfacher gehen wenn die Datenstruktur so verschachtelt vorliegt.

Vielleicht kann man die Daten anders speichern, damit es einfacher geht. Zum Beispiel in nur zwei Dictionaries mit den ersten beiden Koordinaten als Schlüssel, also so: Werte[x, y][z], dann ist es mit einer Schleife oder "list comprehension" machbar.
Antworten