协慌网

登录 贡献 社区

如何在 Python 中获得两个变量的逻辑异或?

如何在 Python 中获得两个变量的逻辑异或?

例如,我有两个期望是字符串的变量。我想测试其中只有一个包含 True 值(不是 None 或空字符串):

str1 = raw_input("Enter string one:")
str2 = raw_input("Enter string two:")
if logical_xor(str1, str2):
    print "ok"
else:
    print "bad"

^运算符似乎是按位的,并且未在所有对象上定义:

>>> 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'

答案

如果您已经将输入归一化为布尔值,则!= 为 xor。

bool(a) != bool(b)

您始终可以使用 xor 的定义从其他逻辑运算中进行计算:

(a and not b) or (not a and b)

但这对我来说太冗长了,乍一看并不清楚。另一种方法是:

bool(a) ^ bool(b)

两个布尔值上的 xor 运算符是逻辑 xor(与 ints 不同,后者是按位的)。这是有道理的,因为bool int的子类,但是被实现为仅具有值0101时,逻辑异或等效于按位异或。

因此, logical_xor函数将实现为:

def logical_xor(str1, str2):
    return bool(str1) ^ bool(str2)

感谢 Python-3000 邮件列表上的 Nick Coghlan

operator模块(与^运算符相同)中,Python 内置了按位异或运算符:

from operator import xor
xor(bool(a), bool(b))  # Note: converting to bools is essential