Listenverständnis aufteilende Schleifenvariable

Verzeihen Sie mir bitte zuerst den etwas schlechten Titel. Ich war mir nicht ganz sicher, wie ich es ausdrücken sollte. Wenn jemand einen besseren Titel vorschlagen könnte, wäre das großartig.

Ich versuche herauszufinden, ob es eine Möglichkeit gibt, den Wert jeder Iteration eines Listenverständnisses nur einmal aufzuteilen, aber in der Ausgabe zweimal zu verwenden. Ein Beispiel für das Problem, das ich zu lösen versuche, ist:

Ich habe die Zeichenfolge

<code>a = "1;2;4\n3;4;5"
</code>

Und ich würde das gerne machen:

<code>>>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5]
[('2', '4'), ('4', '5')]
</code>

Ohne dreimal laufen zu müssen. So etwas in der Art (was offensichtlich eine ungültige Syntax ist, aber hoffentlich ausreicht, um die Botschaft zu vermitteln):

<code>[(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5]
</code>

In dieser Frage bin ichnicht auf der Suche nach ausgefallenen Möglichkeiten, um die 2. und 3. Spalte der Zeichenfolge zu erhalten. Es ist nur eine Möglichkeit, ein konkretes Beispiel zu liefern. Ich könnte natürlich für das Beispiel verwenden:

<code>[x.split(";")[1:3] for x in a.split("\n")]
</code>

Die möglichen Lösungen, an die ich gedacht habe:

Verwenden Sie kein ListenverständnisLass es wie es istVerwenden Sie diecsv.DictReader, benenne meine Spalten und so ähnlichStringIO um ihm den Input zu geben.

Dies ist meistens ein gutes Muster, um in der Lage zu sein, einen bestimmten Fall zu verwenden, sodass es schwierig ist, die Fragen "Warum möchten Sie dies tun" oder "Wofür ist das?" Zu beantworten

Aktualisieren: Nachdem ich die Lösung unten gelesen hatte, führte ich einige Geschwindigkeitstests durch. Und ich fand in meinen sehr grundlegenden Tests heraus, dass die bereitgestellte Lösung 35% schneller war als die obige naive Lösung.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage