zweidimensionale liste elegant auslesen

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
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Hallöchen, ich hab ein klitzekleines prob ....

ich habe eine zweidimensionale liste ...

nun möchte eine neue liste erstellen, die jeweils nur das erste Element der Unterliste (sagt man das so?) enthält

natürlich kann man das so machen:

Code: Alles auswählen

neue_liste=[]
for elem in alte_liste:neue_liste.append(elem[0])
aber das sieht erstens nicht gerade elegant aus und zweitens bin ich mir fast sicher, dass es in Python eine Möglichkeit gibt, das einfacher zu machen. So was nach dem Motte:

Code: Alles auswählen

neue_liste=(elem[0] for elem in alte_liste)
doch leider weiß ich nicht wie --> meine Frage, wie kann ich das machen.

thx, cime

PS: ich hoffe ich hab mein problem ausführlich genug formuliert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du hast den Code fast schon selbst geschrieben:

Code: Alles auswählen

In [1]: d = [[1, 2], [3, 4]]
In [2]: f = [elem[0] for elem in d]
In [3]: f
Out[3]: [1, 3]
Und wenn du die eckigen Klammern in der zweiten Zeile ersetzt, hast du eine Generator Expression statt einer List Comprehension. Aber für kurze Listen sind LCs wohl besser.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Leonidas hat geschrieben:Du hast den Code fast schon selbst geschrieben:

Code: Alles auswählen

In [1]: d = [[1, 2], [3, 4]]
In [2]: f = [elem[0] for elem in d]
In [3]: f
Out[3]: [1, 3]
Und wenn du die eckigen Klammern in der zweiten Zeile ersetzt, hast du eine Generator Expression statt einer List Comprehension. Aber für kurze Listen sind LCs wohl besser.
also ersteinmal danke, genau das hab ich gesucht .... *G* naja, um ehrlich zu sein, ich hatts irgendwo schon ma gesehen, aber wieder vergessen und naja auch nich wiedergefunden ...

was mich jetzt noch interessieren würde, ist, was es mit dieser Generator Expression auf sich hat ... ich hab zwar danach gegooglet, aber nichts schönes gefunden, dass auch verständlich war
thx, cime
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Jo, das würd mich auch mal interessieren, duch was genau soll man die eckigen Klammern ersetzen?
BlackJack

Die eckigen Klammern einfach durch Runde ersetzen. Dann bekommt man einen Generator-Ausdruck. Der wird, genau wie Generator-Funktionen zu einem Iterator "ausgewertet". Das war's dann auch schon.
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Ah :-)
Geht (zumindest bei mir) aber erst ab Python2.4, falls es jemand ausprobieren will...
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

BlackJack hat geschrieben:Die eckigen Klammern einfach durch Runde ersetzen. Dann bekommt man einen Generator-Ausdruck. Der wird, genau wie Generator-Funktionen zu einem Iterator "ausgewertet". Das war's dann auch schon.
thx, als ich unter generator expression gesucht habe, hatte ich nichts gefunden, aber unter generator function wars leicht --> danke für den richtigen suchbegriff ... (hatte mich vorher damit noch nicht beschäftigt)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hier noch der passende Ausschnitt aus dem What's new in Python 2.4 Dokument. Ihr seht, Generator Expressions sind erst ab 2.4 dabei.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Leonidas hat geschrieben:Hier noch der passende Ausschnitt aus dem What's new in Python 2.4 Dokument. Ihr seht, Generator Expressions sind erst ab 2.4 dabei.
thanx
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

mir ist noch eine Frage eingefallen, für die ich bisher keine antwort nirgends gefunden habe .... wie kann ich einer generator function bei jeden neuen aufruf eine neue Variable überweisen ???

Beispiel: ich schreibe gerade an einer Funktion, die einen Graphen zeichnet ... jetzt werden die Funktionswerte aber online ausgelesen, sodass ich die generator function immer neu aufrufe, wenn ich einen neuen Funktionswert habe ... prob: wie übergebe ich diesen neuen Funktionswert der generator function

thx fürs drüber nachdenken

mfg cime
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

cime hat geschrieben:Beispiel: ich schreibe gerade an einer Funktion, die einen Graphen zeichnet ... jetzt werden die Funktionswerte aber online ausgelesen, sodass ich die generator function immer neu aufrufe, wenn ich einen neuen Funktionswert habe ... prob: wie übergebe ich diesen neuen Funktionswert der generator function
Das ist nicht möglich, dazu nimmst du eine normale Funktion. Eine Generator-Funktion ist eine Funktion, deren Zustand du wiederherstellen kannst (dort wo yield die Funktion verlassen hat), jedoch würde es ja keinen Sinn machen, eine Funktion zu nutzen, deren Zustand wiederhergestellt wird, wenn der Zustand (also die Variable) anders ist. Dafür gibt es immer noch die guten, alten, normalen Funktionen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Also ich habe die Frage glaube ich nicht so ganz verstanden!?

Wenn man eine Generator Funktion immer wieder aufruft, dann erhält man immer einen Iterator bei jedem Aufruf.

Wenn die Werte "online ausgelesen" werden, dann könntest Du der Funktion vielleicht die Quelle als Argument übergeben.

Code: Alles auswählen

def iter_values(source):
    while True:
        yield source.read()
Das ist natürlich nur "Pseudocode". Ich weiss ja nicht wie die Daten bei Dir gelesen werden.
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

das auslesen wird dann von einem freund übernommen, aber deine idee ist gut, so werd ichs machen ... thx
Antworten