¿Cómo se obtiene el xor lógico de dos variables en Python?

Resuelto Zach Hirsch asked hace 16 años • 29 respuestas

¿ 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'
Zach Hirsch avatar Jan 11 '09 19:01 Zach Hirsch
Aceptado

Si ya está normalizando las entradas a valores booleanos, entonces != es xor.

bool(a) != bool(b)
A. Coady avatar Jan 11 '2009 16:01 A. Coady

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 booles solo una subclase deint , pero se implementa para tener solo los valores 0y 1. Y xor lógico es equivalente a xor bit a bit cuando el dominio está restringido a 0y 1.

Entonces la logical_xorfunció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 .

Zach Hirsch avatar Jan 11 '2009 12:01 Zach Hirsch