2016-10-21 215 views
0

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

我正在考虑将每个布尔值转换为0(false)或1(true)并将它们全部加起来,并检查总和是否为1。这很简约,但我想知道是否存在(按位)操作如果只有一个元素为真,而其他元素为false,这将为我节省bool - > int转换(不管它简单)。我大多只是好奇这种按位操作是否存在。

回答

4

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

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

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

+0

这很漂亮,谢谢 – amphibient

+0

我相信在第二个代码中有一个输入错误,你可能意味着条件中的'result'变量。 – table

+0

@table - 谢谢:-)。这就是我的意思。这就是为什么我们有单元测试:-p – mgilson

相关问题