Wie erhalten Sie die logisches Xor von zwei Variablen in Python?
Ich habe zum Beispiel zwei Variablen, von denen ich erwarte, dass sie Zeichenketten sind. Ich möchte testen, ob nur eine von ihnen einen wahren Wert enthält (also nicht None oder die leere Zeichenkette ist):
str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")
if logical_xor(str1, str2):
print "ok"
else:
print "bad"
El ^
Operator scheint bitweise zu sein und ist nicht für alle Objekte definiert:
>>> 1 ^ 1
0
>>> 2 ^ 1
3
>>> "abc" ^ ""
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for ^: 'str' and 'str'
6 Stimmen
Wie definiert man "xor" für ein Paar von Zeichenketten? Was sollte "abc" ^ "" Ihrer Meinung nach zurückgeben, was es nicht tut?
25 Stimmen
Es sollte True zurückgeben, anstatt eine Exception auszulösen, da nur eine der Zeichenketten True ist, wie durch den normalen Python-Typ bool definiert.
72 Stimmen
Ich bin erstaunt, dass Python keinen Infix-Operator namens "xor" hat, was die intuitivste, pythonische Implementierung wäre. Die Verwendung von "^" ist konsistent mit anderen Sprachen, aber nicht so offensichtlich lesbar wie das meiste in Python.
23 Stimmen
@MehrdadAfshari Die offensichtliche Antwort auf Ihre Frage ist, dass
a xor a
ist definiert als(a and not b) or (not a and b)
, und soa xor b
wenna
etb
Zeichenketten oder andere Typen sind, sollten das ergeben, was(a and not b) or (not a and b)
erbringt.2 Stimmen
Das Problem ist, dass die Dokumentation unzureichend ist. ^ ist "bitweises exklusives oder", was wörtlich interpretiert Bit für Bit bedeutet, nicht bool für bool. x'FFFF00' ^ x'FFFF00' sollte also x'000000' sein. Oder soll dies nur auf der Basis von einzelnen Zeichen geschehen, die als Zahlen gegossen werden? Wir müssen die kürzeren Zeichen der Zeichenkette iterieren, um sie an die Länge der längeren Zeichenkette anzupassen. All dies sollte eingebaut sein.
0 Stimmen
@mckenzm Falls Ihnen das weiterhilft,
int("0xFFFF00", 16) ^ int("0xFFFF00", 16) == int(0)
also ja, Sie müssen die Nummer eingeben und anrufenhex
auf das Ergebnis und füllt dann das Ergebnis mit genügend 0 auf der linken Seite auf, um die längste Länge zu erreichen.0 Stimmen
@Guimoute Danke, das ist ein bisschen Arbeit, aber mit Füllung/Ausrichtung machbar.