在True
中确定布尔列表中只有一个元素是Python
的最简单方法是什么?
我正在考虑将每个布尔值转换为0(假)或1(真)并将它们全部添加并检查总和是否为1.这是非常极简的但是我想知道是否存在(按位)操作如果只有一个元素为真且所有其他元素为假,则返回true,这将为我节省bool - > int转换(无论多么简单)。我几乎只是对这种按位操作是否存在感到好奇。
答案 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
但我不建议使用这个版本: - )