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

时间:2016-10-21 21:43:50

标签: python bit-manipulation

True中确定布尔列表中只有一个元素是Python的最简单方法是什么?

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

1 个答案:

答案 0 :(得分:7)

来自bool

Python int子类,因此您无需进行任何转换:

>>> sum([True, False, False])
1
>>> sum([True, True, True])
3

此解决方案不会短路......但在某些情况下,您可能希望能够提前纾困:

result = 0
for item in boolean_iterable:
    result += item
    if result > 1:
        break  # Short-circuit early

但是,除非您的布尔迭代非常大,并且您希望经常短路,否则我认为这会比平均情况下的sum表现更差(这可以将循环推送到更优化的代码)。

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

>>> 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

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