Python UND Operator auf zwei booleschen Listen - wie?
Habe ich zwei boolean-Listen, z.B.,
x=[True,True,False,False]
y=[True,False,True,False]
Ich will UND diese Listen zusammen mit dem erwarteten Ausgang:
xy=[True,False,False,False]
Dachte ich, dass der Ausdruck x and y
würde, doch kam zu entdecken, dass es nicht: in der Tat (x and y) != (y and x)
Ausgabe von x and y
: [True,False,True,False]
Ausgabe von y and x
: [True,True,False,False]
Mit list comprehension hat korrekte Ausgabe. Uff!
xy = [x[i] and y[i] for i in range(len(x)]
Verstand Sie, ich konnte nicht finden jede Bezugnahme sagte mir, ich den UND-operator funktionieren würde, wie ich versuchte, mit x und y ist. Aber es ist einfach zu versuchen, die Dinge in Python.
Kann jemand mir erklären was ist passiert mit x and y
?
Und hier ist ein einfaches test-Programm:
import random
random.seed()
n = 10
x = [random.random() > 0.5 for i in range(n)]
y = [random.random() > 0.5 for i in range(n)]
# Next two methods look sensible, but do not work
a = x and y
z = y and x
# Next: apparently only the list comprehension method is correct
xy = [x[i] and y[i] for i in range(n)]
print 'x : %s'%str(x)
print 'y : %s'%str(y)
print 'x and y : %s'%str(a)
print 'y and x : %s'%str(z)
print '[x and y]: %s'%str(xy)
x und y
ist true, wenn und nur wenn beide Listen nicht-leer ist (eine leere Liste ist falsch-y', alle nicht-leere Listen sind "Wahrheit-y'): x und y
ist nicht 'und jedes element' oder sonst kümmern sich die Werte. Kommentarautor: user2864740InformationsquelleAutor der Frage Glenn N | 2015-08-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
and
gibt einfach entweder der erste oder der zweite operand ist, auf Ihre Wahrheit Wert. Wenn der erste operand betrachtet wird false zurückgegeben, sonst wird der andere operand wird zurückgegeben.Listen sind als wahr wenn nicht leer, so dass beide Listen werden als true betrachtet. Ihre Inhalte nicht spielen hier eine Rolle.
Da beide Listen sind nicht leer,
x and y
gibt einfach die zweite Liste Objekt; nur wennx
leer war, wäre es zurückgegeben statt:Sehen die Wahrheit Wert testen - Abschnitt in der Python-Dokumentation:
(Hervorhebung von mir), und die Boolesche Operationen - Abschnitt rechts unten:
Sie tatsächlich benötigen, um zu testen, die Werte enthalten in den Listen explizit. Sie können dies tun, mit einer Liste Verständnis, wie Sie entdeckt. Schreiben Sie es mit der
zip()
- Funktion paar bis die Werte:InformationsquelleAutor der Antwort Martijn Pieters
Könnten Sie numpy:
Numpy ermöglicht numerische und logische Operationen auf arrays wie:
Können Sie durchführen bitweise und-Verknüpfung mit der
&
Betreiber.Statt einer Liste Verständnis, die Sie verwenden können, numpy zu generieren, die boolean-array direkt so:
InformationsquelleAutor der Antwort dawg
and
ist nicht unbedingt ein boolescher operator, es gibt einen von zwei Argumente, die unabhängig von Ihrem Typ. Wenn das erste argument falsch ist-ish (False
numerischen null oder ein leerer string/container), es gibt das argument. Ansonsten, es gibt das zweite argument.In deinem Fall, beide
x
undy
sind nicht-leere Listen, so das erste argument ist immer wahr-ish, was bedeutetx and y
zurücky
undy and x
zurückx
.InformationsquelleAutor der Antwort chepner
Sollte dies tun, was Sie wollen:
Den Grund
x and y
zurücky
undy and x
zurückx
ist, weil booleschen Operatoren in python gib den letzten Wert geprüft, bestimmt die wahr-heit des Ausdrucks. Nicht-leerelist
's bewerten zuTrue
, und daand
erforderlich, dass beide Operanden auswertenTrue
die letzten Operanden geprüft wird der zweite operand ist. Kontrast mitx or y
, was wiederx
weil Sie nicht brauchen, um zu überprüfeny
zu bestimmen, die wahr-heit des Ausdrucks.InformationsquelleAutor der Antwort Cyphase
Anstatt
könnte man verwenden Sie einfach die Möglichkeit, numpy, sich zu vermehren bool-Werte:
Tun oder übersehe ich ein Sonderfall?
InformationsquelleAutor der Antwort Philipp
Können Sie die
zip
FunktionInformationsquelleAutor der Antwort Uri Goren
Zusätzlich zu dem, was @Martijn Pieters hat geantwortet, ich möchte nur hinzufügen, den folgenden code zu erklären
and
undor
Operationen in Aktion.and
gibt den ersten falsy-Wert festgestellt sonst die letzten argument ausgewertet.Ähnlich
or
gibt den ersten Wert truthy begegnet else dem letzten argument ausgewertet.Werte sind
and_list = [1, 0, 0, 0, 0, 0, 0, 0]
or_list = [3, 3, 3, 3, 2, 2, 1, 0]
InformationsquelleAutor der Antwort Tony