如何在 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
的子类,但是被实现为仅具有值0
和1
。 0
和1
时,逻辑异或等效于按位异或。
因此, logical_xor
函数将实现为:
def logical_xor(str1, str2):
return bool(str1) ^ bool(str2)
operator
模块(与^
运算符相同)中,Python 内置了按位异或运算符:
from operator import xor
xor(bool(a), bool(b)) # Note: converting to bools is essential