0
确定布尔表中只有一个元素是中的True
的最简单方法是什么?布尔列表中只有一个元素为true?
我正在考虑将每个布尔值转换为0(false)或1(true)并将它们全部加起来,并检查总和是否为1。这很简约,但我想知道是否存在(按位)操作如果只有一个元素为真,而其他元素为false,这将为我节省bool - > int转换(不管它简单)。我大多只是好奇这种按位操作是否存在。
确定布尔表中只有一个元素是中的True
的最简单方法是什么?布尔列表中只有一个元素为true?
我正在考虑将每个布尔值转换为0(false)或1(true)并将它们全部加起来,并检查总和是否为1。这很简约,但我想知道是否存在(按位)操作如果只有一个元素为真,而其他元素为false,这将为我节省bool - > int转换(不管它简单)。我大多只是好奇这种按位操作是否存在。
的Python bool
从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
但是,除非你的布尔iterables真大,你期望短路频繁,我希望它可以在平均情况下表现比sum
恶化(WH ich可以将循环推向更优化的代码)。
此外,如果你正在寻找聪明的方式按位运算要做到这一点,你可以在一个reduce
操作使用xor
:
>>> 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
但是使用这个版本我不会建议:-)
这很漂亮,谢谢 – amphibient
我相信在第二个代码中有一个输入错误,你可能意味着条件中的'result'变量。 – table
@table - 谢谢:-)。这就是我的意思。这就是为什么我们有单元测试:-p – mgilson