Wie um zu überprüfen, ob alle Elemente einer Liste entspricht einem Zustand?
Ich habe eine Liste, bestehend aus wie 20000 Listen. Ich nutze jede Liste das 3. element, wie eine fahne. Ich möchte einige Vorgänge auf dieser Liste so lange wie mindestens ein element ist-flag ist 0, es ist wie:
my_list = [["a", "b", 0], ["c", "d", 0], ["e", "f", 0], .....]
In der Anfang, alle flags auf 0. Ich benutze eine while-Schleife, um zu überprüfen, wenn mindestens ein element ist-flag ist 0:
def check(list_):
for item in list_:
if item[2] == 0:
return True
return False
Wenn check(my_list)
zurück True
, dann arbeite ich weiter an meiner Liste:
while check(my_list):
for item in my_list:
if condition:
item[2] = 1
else:
do_sth()
Eigentlich wollte ich ein element entfernen, in my_list ein als ich der Iteration ist es, aber ich darf nicht, um Elemente zu entfernen, wie ich Durchlaufen.
Original my_list ein nicht-flags:
my_list = [["a", "b"], ["c", "d"], ["e", "f"], .....]
Da konnte ich nicht entfernen, die Elemente wie ich Sie iteriert über es, ich erfand diese Flaggen. Aber die my_list
viele Elemente enthält, und while
Schleife liest alle von Ihnen an jedem for
Schleife, und es verbraucht viel Zeit! Haben Sie irgendwelche Vorschläge?
Vielleicht könnten Sie ersetzen die Elemente, die mit
None
oder []
als Sie die Liste Durchlaufen, anstatt Sie zu entfernen. Überprüfen Sie die ganze Liste mit 'check()` Iteration über alle Elemente vor jedem pass auf die innere Schleife ist eine sehr langsame Annäherung.InformationsquelleAutor alwbtc | 2012-05-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die beste Antwort ist es, zu
all()
, die ist vordefiniert für diese situation. Wir kombinieren dies mit einem generator-Ausdruck zu produzieren, das Ergebnis, die Sie wollen, sauber und effizient. Zum Beispiel:Und für seine filter-Beispiel, eine Liste Verständnis:
Wenn Sie überprüfen möchten, die mindestens ein element ist 0, die bessere option ist die Verwendung
any()
, das ist besser lesbar:Eine Liste Verständnis ist nicht das gleiche wie ein generator-Ausdruck. Als
all()
undany()
Kurzschluss, wenn z.B. der erste Wert auf mine ausgewertetFalse
,all()
fehl, und nicht überprüfen, keine Werte mehr, die RückkehrFalse
. Dein Beispiel wird das gleiche tun, außer es generiert die gesamte Liste der Vergleiche erste, der bedeutet, dass eine Bearbeitung so viel für nichts.InformationsquelleAutor Gareth Latty
Könnten Sie itertools ist takewhile wie diese, es wird aufhören, sobald eine Bedingung erfüllt ist, scheitert Ihre Aussage. Die entgegengesetzte Methode wäre dropwhile
InformationsquelleAutor Hedde van der Heide
Wenn Sie möchten, um zu überprüfen, ob ein Element in der Liste verstößt gegen die Bedingung der Nutzung
all
:Entfernen alle Elemente, die nicht zusammenpassen, verwenden
filter
[...]
imall(...)
da kann es dann einen generator erzeugen, anstatt eine Liste, die nicht nur spart Sie zwei Zeichen, sondern spart auch Speicher und Zeit. Durch die Verwendung von Generatoren, wird nur ein item berechnet (frühere Ergebnisse werden gelöscht, da nicht mehr benutzt) und wenn einer von Ihnen stellt sich herausFalse
ist, Stoppt der generator die Berechnung des rest.InformationsquelleAutor Hampus Nilsson
dieser Weg ist ein bisschen mehr flexible als die Verwendung
all()
:InformationsquelleAutor mulllhausen
Andere Weise zu verwenden
itertools.ifilter
. Dieser prüft, truthiness und Prozess(mit
lambda
)Probe-
InformationsquelleAutor SIslam