it-swarm.com.de

Python für und wenn in einer Zeile

Ich habe ein Problem mit Python.

Ich mache eine einfache Liste:

>>> my_list = ["one","two","three"]

Ich möchte einen "einzeiligen Code" erstellen, um eine Zeichenfolge zu finden.

ich habe zum Beispiel diesen Code:

>>> [(i) for i in my_list if i=="two"]
['two']

Aber wenn ich aufpasse, ist die Variable falsch (ich finde den letzten Wert meiner Liste):

>>> print i
three

Warum enthält meine Variable das letzte Element und nicht das Element, das ich finden möchte?

8
rostonik

Sie erzeugen ein gefilterte Liste, indem Sie ein Listenverständnis verwenden. i ist immer noch an jedes einzelne Element dieser Liste gebunden, und das letzte Element ist immer noch 'three', auch wenn es später aus der erstellten Liste herausgefiltert wurde.

Sie sollten kein Listenverständnis verwenden, um ein Element auszuwählen. Verwenden Sie einfach eine for-Schleife und break, um sie zu beenden:

for elem in my_list:
    if elem == 'two':
        break

Wenn Sie must einen Einzeiler haben (was der Philosophie von Python zuwiderlaufen würde, wo Lesbarkeit zählt), verwenden Sie die Funktion next() und einen Generatorausdruck:

i = next((elem for elem in my_list if elem == 'two'), None)

was i auf None setzt, wenn es kein solches übereinstimmendes Element gibt.

Das Obige ist ein Filter nicht so nützlich; Sie testen im Wesentlichen, ob der Wert 'two' in der Liste enthalten ist. Sie können in dafür verwenden:

elem = 'two' if 'two' in my_list else None
13
Martijn Pieters

Wenn Sie durchführen

>>> [(i) for i in my_list if i=="two"]

i wird durch die Liste my_list durchlaufen. Wenn das Listenverständnis die Auswertung beendet, wird i dem letzten Element der Iteration zugewiesen, nämlich "three".

10
Cong Ma

Beim Listenverständnis wird die Schleifenvariable i global. Nach der Iteration in der for-Schleife ist dies ein Verweis auf das letzte Element in Ihrer Liste.

Wenn Sie alle Übereinstimmungen wünschen, weisen Sie die Liste einer Variablen zu:

filtered =  [ i for i in my_list if i=='two']

Wenn Sie nur die erste Übereinstimmung wünschen, können Sie einen Funktionsgenerator verwenden

try:
     m = next( i for i in my_list if i=='two' )
except StopIteration:
     m = None
1
desiato