Seite 1 von 1

zweidimensionale liste elegant auslesen

Verfasst: Sonntag 23. Oktober 2005, 15:58
von cime
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.

Verfasst: Sonntag 23. Oktober 2005, 16:28
von Leonidas
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.

Verfasst: Sonntag 23. Oktober 2005, 16:51
von cime
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

Verfasst: Sonntag 23. Oktober 2005, 17:58
von henning
Jo, das würd mich auch mal interessieren, duch was genau soll man die eckigen Klammern ersetzen?

Verfasst: Sonntag 23. Oktober 2005, 23:22
von 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.

Verfasst: Montag 24. Oktober 2005, 10:27
von henning
Ah :-)
Geht (zumindest bei mir) aber erst ab Python2.4, falls es jemand ausprobieren will...

Verfasst: Montag 24. Oktober 2005, 11:22
von cime
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)

Verfasst: Montag 24. Oktober 2005, 12:20
von Leonidas
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.

Verfasst: Dienstag 25. Oktober 2005, 12:24
von cime
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

Verfasst: Dienstag 25. Oktober 2005, 13:53
von cime
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

Verfasst: Dienstag 25. Oktober 2005, 15:11
von Leonidas
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.

Verfasst: Dienstag 25. Oktober 2005, 22:13
von 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.

Verfasst: Mittwoch 26. Oktober 2005, 07:09
von cime
das auslesen wird dann von einem freund übernommen, aber deine idee ist gut, so werd ichs machen ... thx