2016-10-21 213 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

相關問題