我正在寻找一种简单的方法来检查变量列表中是否只有一个变量具有True值。 我已经看过这个logical xor post,并试图找到一种方法来适应多个变量,只有一个是真的。
实施例
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
答案 0 :(得分:19)
没有一个内置但是你不难自己动手:
def TrueXor(*args):
return sum(args) == 1
由于“[b] ooleans是普通整数的子类型”(source),你可以很容易地对整数列表求和,你也可以将真正的布尔值传递给这个函数。
所以这两个电话是同质的:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
如果您想要显式布尔转换:sum( bool(x) for x in args ) == 1
。
答案 1 :(得分:7)
我认为基于总和的解决方案适用于给定的示例,但请记住,python中的布尔谓词总是使其评估短路。因此,您可能需要考虑与all and any更加一致的内容。
def any_one(iterable):
it = iter(iterable)
return any(it) and not any(it)
答案 2 :(得分:3)
>>> def f(*n):
... n = [bool(i) for i in n]
... return n.count(True) == 1
...
>>> f(0, 0, 0)
False
>>> f(1, 0, 0)
True
>>> f(1, 0, 1)
False
>>> f(1, 1, 1)
False
>>> f(0, 1, 0)
True
>>>
答案 3 :(得分:1)
您链接的问题已经为两个变量提供了解决方案。您所要做的就是将其扩展为处理n个变量:
import operator
def only_one_set(*vars):
bools = [bool(v) for v in vars]
return reduce(operator.xor, bools, False)
>>> a, b, c, d, e = False, '', [], 10, -99
>>> only_one_set(a, b, c, d)
True
>>> only_one_set(a, b, c, d, e)
False
答案 4 :(得分:1)
这是我直截了当的方法。我已经将它重命名为only_one,因为xor有多个输入通常是奇偶校验,而不是“只有一个”检查器。
def only_one(*args):
result = False
for a in args:
if a:
if result:
return False
else:
result = True
return result
测试:
>>> only_one(1,0,0)
True
>>> only_one(0,0,1)
True
>>> only_one(1,1,0)
False
>>> only_one(0,0,0,0,0)
False
>>> only_one(1,1,0,1)
False