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

2022-09-05 01:15:51

如何在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'

答案 1

如果您已经将输入规范化为布尔值,则 != 是 xor。

bool(a) != bool(b)

答案 2

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

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

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

bool(a) ^ bool(b)

两个布尔值上的异或运算符是逻辑异或(与 int 上的异或不同,在 int 上它是按位的)。这是有道理的,因为 bool 只是 int 的一个子类,但实现为仅具有值和 。逻辑异或等效于按位异或,当域被限制为 和 时。0101

因此,该函数将实现如下:logical_xor

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

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