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