我正在寻找一种简单的方法来检查变量列表中是否只有一个变量具有True值.我已经看过这个逻辑xor帖子,并试图找到一种方法来适应多个变量,只有一个是真的.
例
>>>TrueXor(1,0,0)
True
>>>TrueXor(0,0,1)
True
>>>TrueXor(1,1,0)
False
>>>TrueXor(0,0,0,0,0)
False
Run Code Online (Sandbox Code Playgroud)
And*_*are 19
没有一个内置,但它不是很难你自己:
def TrueXor(*args):
return sum(args) == 1
Run Code Online (Sandbox Code Playgroud)
由于"[b] ooleans是普通整数的子类型"(源),你可以很容易地对整数列表求和,你也可以将真正的布尔值传递给这个函数.
所以这两个调用是同质的:
TrueXor(1, 0, 0)
TrueXor(True, False, False)
Run Code Online (Sandbox Code Playgroud)
如果你想要显式的布尔转换:sum( bool(x) for x in args ) == 1.
我认为基于总和的解决方案适用于给定的示例,但请记住,python中的布尔谓词总是使其评估短路.所以你可能想要考虑一些与所有和任何更一致的东西.
def any_one(iterable):
it = iter(iterable)
return any(it) and not any(it)
Run Code Online (Sandbox Code Playgroud)
>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)