如何在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在Python中是^。它返回:

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

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

其他回答

我已经测试了几种方法(包括使用shadow wranger建议的truth()函数)。

%timeit  (not a) ^  (not b)   # 47 ns
%timeit  (not a) != (not b)   # 44.7 ns
%timeit truth(a) != truth(b)  # 116 ns
%timeit  bool(a) != bool(b)   # 190 ns

奖励线程:

阳极的想法……您只需尝试(可能是)python表达式«is not»,以获得逻辑«xor»的行为

真值表是:

>>> True is not True
False
>>> True is not False
True
>>> False is not True
True
>>> False is not False
False
>>>

对于你的例子字符串:

>>> "abc" is not  ""
True
>>> 'abc' is not 'abc' 
False
>>> 'abc' is not '' 
True
>>> '' is not 'abc' 
True
>>> '' is not '' 
False
>>> 

然而;正如上面所指出的,这取决于你想要抽出任意一对字符串的实际行为,因为字符串不是bolean…甚至更多:如果你«潜入Python»你会发现«“and”和“or”的特殊性质» http://www.diveintopython.net/power_of_introspection/and_or.html

抱歉我的书面英语,它不是我天生的语言。

的问候。

简单,容易理解:

sum(bool(a), bool(b)) == 1

如果一个排他性的选项是你想要的,即从n个选项中选择1个,它可以扩展为多个参数:

sum(bool(x) for x in y) == 1

Xor在Python中是^。它返回:

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

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

假设A和B是bool。

A is not B