布尔列表中只有一个元素是真的吗?

amp*_*ent 2 python bit-manipulation

什么是确定只有一个在布尔列表元素是否是最起码的方式TruePython

我正在考虑将每个布尔值转换为0(假)或1(真)并将它们全部添加并检查总和是否为1.这是非常简约但我想知道是否存在将返回true的(按位)操作如果只有一个元素是真的而所有其他元素都是假的,这将为我节省bool - > int转换(无论多么简单).我大多只是对这种按位操作是否存在感到好奇.

mgi*_*son 8

Python bool子类,int所以你不需要做任何转换:

>>> sum([True, False, False])
1
>>> sum([True, True, True])
3
Run Code Online (Sandbox Code Playgroud)

然而,这种解决方案不会短路......在某些情况下,您可能希望能够提前挽救:

result = 0
for item in boolean_iterable:
    result += item
    if result > 1:
        break  # Short-circuit early
Run Code Online (Sandbox Code Playgroud)

但是,除非您的布尔迭代非常大,并且您希望频繁地短路,否则我预计这会比sum平均情况(可以将循环推送到更优化的代码)更糟糕.

此外,如果您正在寻找通过逐位算术执行此操作的聪明方法,则可以xorreduce操作中使用:

>>> from functools import reduce
>>> import operator
>>> reduce(operator.xor, [True, False, False], False)
True
>>> reduce(operator.xor, [True, False, True], False)
False
>>> reduce(operator.xor, [], False)
False
>>> reduce(operator.xor, [True], False)
True
Run Code Online (Sandbox Code Playgroud)

但我不建议使用这个版本:-)