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

def xor(a,b):
    return a !=b

例子:

xor(真,假)>>真

其他回答

你使用和C中一样的异或运算符,也就是^。

我不知道为什么,但投票最多的解决方案是bool(A) != bool(B),而我想说的是-与C的^运算符一致,最明显的解决方案是:

bool(A) ^ bool(B)

对于任何来自C或任何C衍生语言的人来说,它更易于阅读和立即理解……

在进行代码高尔夫时,可能是这样

not A ^ (not B)

将是赢家。使用not作为布尔值的转换器(比bool()小一个字母)。对于第一个表达式在某些情况下可以省略副命题。好吧,这要看情况,在必须不(A) ^ (not(B))的情况下,bool()需要相同数量的字母……

按位异或已经内置在Python的operator模块中(与^ operator相同):

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

这个怎么样?

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

如果b为假会给出a 如果a为假,会给出b 否则会返回False

或者使用Python 2.5+三元表达式:

(False if a else b) if b else a

Python处理逻辑操作的方式可能令人困惑,因此我的实现为用户提供了一个简单的True/False答案选项(默认情况下)。实际的Python结果可以通过将可选的第三个参数设置为None来获得。

def xor(a, b, true=True, false=False): # set true to None to get actual Python result
    ab1 = a and not b
    ab2 = not a and b
    if bool(ab1) != bool(ab2):
        return (ab1 or ab2) if true is None else true
    else:
        return false

Xor在Python中是^。它返回:

int型的逐位xor bool的逻辑xor 集合的独占联合 实现__xor__的类的用户定义结果。 TypeError用于未定义的类型,例如字符串或字典。

如果你打算在字符串上使用它们,将它们转换为bool类型可以使你的操作明确(也可以是set(str1) ^ set(str2))。