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?
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
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"
.
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