¿Cómo se obtiene el xor lógico de dos variables en Python?
¿ Cómo se obtiene el xor lógico de dos variables en Python?
Por ejemplo, tengo dos variables que espero que sean cadenas. Quiero probar que solo uno de ellos contiene un valor Verdadero (no es Ninguno ni una cadena vacía):
str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")
if logical_xor(str1, str2):
print "ok"
else:
print "bad"
El ^
operador es bit a bit y no está definido en todos los objetos:
>>> 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'
Si ya está normalizando las entradas a valores booleanos, entonces != es xor.
bool(a) != bool(b)
Siempre puedes usar la definición de xor para calcularlo a partir de otras operaciones lógicas:
(a and not b) or (not a and b)
Pero esto es demasiado detallado para mí y no está particularmente claro a primera vista. Otra forma de hacerlo es:
bool(a) ^ bool(b)
El operador xor en dos booleanos es xor lógico (a diferencia de ints, donde es bit a bit). Lo cual tiene sentido, ya que bool
es solo una subclase deint
, pero se implementa para tener solo los valores 0
y 1
. Y xor lógico es equivalente a xor bit a bit cuando el dominio está restringido a 0
y 1
.
Entonces la logical_xor
función se implementaría así:
def logical_xor(str1, str2):
return bool(str1) ^ bool(str2)
Crédito a Nick Coghlan en la lista de correo de Python-3000 .