Ich versuche zu verstehen, wie die any()
und die in all()
Python integrierten Funktionen funktionieren.
Ich versuche, die Tupel so zu vergleichen, dass sie zurückgegeben werden, wenn sich ein Wert unterscheidet, True
und wenn sie alle gleich sind, wird er zurückgegeben False
. Wie arbeiten sie in diesem Fall, um [Falsch, Falsch, Falsch] zurückzugeben?
d
ist ein defaultdict(list)
.
print d['Drd2']
# [[1, 5, 0], [1, 6, 0]]
print list(zip(*d['Drd2']))
# [(1, 1), (5, 6), (0, 0)]
print [any(x) and not all(x) for x in zip(*d['Drd2'])]
# [False, False, False]
Meines Wissens sollte dies ausgegeben werden
# [False, True, False]
da (1,1) gleich sind, sind (5,6) unterschiedlich und (0,0) gleich.
Warum wird für alle Tupel False ausgewertet?
Antworten:
Sie können sich grob
any
undall
als eine Reihe von logischenor
bzw.and
Operatoren vorstellen.irgendein
any
wird zurückkehren,True
wenn mindestens eines der Elemente Wahrheit ist. Lesen Sie mehr über das Testen von Wahrheitswerten.alles
all
wirdTrue
nur zurückkehren, wenn alle Elemente wahr sind.Wahrheitstabelle
Anmerkung 1: Der leere iterierbare Fall wird in der offiziellen Dokumentation wie folgt erläutert
any
Da keines der Elemente wahr ist, wird
False
in diesem Fall zurückgegeben.all
Da keines der Elemente falsch ist, wird
True
in diesem Fall zurückgegeben.Anmerkung 2:
Eine weitere wichtige Sache wissen
any
undall
ist, wird es Kurzschluss , die Ausführung, sobald sie wissen , das Ergebnis. Der Vorteil ist, dass nicht die gesamte Iterierbarkeit verbraucht werden muss. Beispielsweise,Hier
(not (i % 6) for i in range(1, 10))
ist ein Generatorausdruck, der zurückgibt,True
wenn die aktuelle Zahl innerhalb von 1 und 9 ein Vielfaches von 6 ist.any
Iteriert dasmultiples_of_6
und wenn es sich trifft6
, findet es einen Wahrheitswert, so dass es sofort zurückkehrtTrue
und der Rest vonmultiples_of_6
nicht iteriert wird. Das ist , was wir sehen , wenn wir druckenlist(multiples_of_6)
, das Ergebnis7
,8
und9
.Diese hervorragende Sache wird in dieser Antwort sehr geschickt verwendet .
Mit diesem Grundverständnis tun Sie dies, wenn wir uns Ihren Code ansehen
was sicherstellt, dass zumindest einer der Werte die Wahrheit ist, aber nicht alle. Deshalb kehrt es zurück
[False, False, False]
. Wenn Sie wirklich überprüfen möchten, ob beide Zahlen nicht gleich sind,quelle
bool(data) and all(...)
sollte funktionieren.any
undall
nehmen Sie iterables und geben Sie zurück,True
wenn alle Elemente vorhanden sindTrue
.Wenn die Iterables leer sind,
any
kehrtFalse
undall
kehrtTrue
.Ich habe heute demonstriert
all
undany
für Schüler im Unterricht. Sie waren größtenteils verwirrt über die Rückgabewerte für leere Iterables. Wenn man es so erklärt, schalten sich viele Glühbirnen ein.Verknüpfungsverhalten
Sie,
any
undall
beide suchen nach einer Bedingung , dass sie zu stoppen Auswertung ermöglicht. Bei den ersten Beispielen mussten sie den Booleschen Wert für jedes Element in der gesamten Liste auswerten.(Beachten Sie, dass das Listenliteral selbst nicht träge ausgewertet wird - dies könnte mit einem Iterator erreicht werden -, dies dient jedoch nur zur Veranschaulichung.)
Hier ist eine Python-Implementierung von allem:
Natürlich sind die realen Implementierungen in C geschrieben und viel leistungsfähiger, aber Sie können die oben genannten ersetzen und die gleichen Ergebnisse für den Code in dieser (oder einer anderen) Antwort erhalten.
all
all
prüft , ob Elemente vorhanden sindFalse
(damit sie zurückkehren könnenFalse
), und gibt sie zurück,True
wenn keines von ihnen vorhanden istFalse
.any
Die Funktionsweise
any
besteht darin, dass nach Elementen gesucht wirdTrue
(damitTrue), then it returns
Falseif none of them were
True zurückgegeben werden kann`.Ich denke, wenn Sie das Abkürzungsverhalten berücksichtigen, werden Sie intuitiv verstehen, wie sie funktionieren, ohne auf eine Wahrheitstabelle verweisen zu müssen.
Nachweis
all
undany
Abkürzung:Erstellen Sie zunächst einen noisy_iterator:
Lassen Sie uns nun anhand unserer Beispiele die Listen geräuschvoll durchlaufen:
Wir können
all
Stopps beim ersten False Boolean Check sehen.Und
any
stoppt beim ersten True Boolean Check:Die Quelle
Schauen wir uns die Quelle an, um das oben Gesagte zu bestätigen.
Hier ist die Quelle für
any
:Und hier ist die Quelle für
all
:quelle
Python/bltinmodule.c
- ich habe es oben hinzugefügt.Ich weiß, dass dies alt ist, aber ich dachte, es könnte hilfreich sein, zu zeigen, wie diese Funktionen im Code aussehen. Dies zeigt wirklich die Logik, besser als Text oder eine Tabelle IMO. In Wirklichkeit sind sie eher in C als in reinem Python implementiert, aber diese sind äquivalent.
Insbesondere können Sie sehen, dass das Ergebnis für leere Iterables nur das natürliche Ergebnis ist, kein Sonderfall. Sie können auch das Kurzschlussverhalten sehen; Es wäre tatsächlich mehr Arbeit , wenn es keinen Kurzschluss gäbe .
Als Guido van Rossum (der Schöpfer von Python) das erste Hinzufügen von
any()
und vorschlugall()
, erklärte er sie, indem er genau die obigen Codeausschnitte veröffentlichte.quelle
Der fragliche Code, nach dem Sie fragen, stammt aus meiner hier gegebenen Antwort . Es sollte das Problem des Vergleichs mehrerer Bit-Arrays lösen, dh Sammlungen von
1
und0
.any
undall
sind nützlich, wenn Sie sich auf die "Wahrhaftigkeit" von Werten verlassen können - dh auf ihren Wert in einem booleschen Kontext. 1 istTrue
und 0 istFalse
, eine Annehmlichkeit, die diese Antwort nutzte. 5 ist zufällig auch soTrue
, wenn Sie das in Ihre möglichen Eingaben mischen ... na ja. Funktioniert nichtSie könnten stattdessen so etwas tun:
Es fehlt die Ästhetik der vorherigen Antwort ( das Aussehen hat mir sehr gut gefallen
any(x) and not all(x)
), aber es erledigt den Job.quelle
True
wann die Werte unterschiedlich sind, sollte die Länge des Satzes 2 sein, nicht 1.quelle
quelle
Das Konzept ist einfach:
quelle
quelle