2012-10-07 106 views
74

真布爾的數量我有布爾列表:計數在Python列表

[True, True, False, False, False, True] 

,我要尋找一個方法來計算的True數量在列表中(所以在上面的例子中,我想返回到3。)我找到了一些尋找特定元素出現次數的例子,但是因爲我正在使用布爾值,所以有更高效的方法去做嗎?我正在考慮類似於allany的東西。

+0

就像記住如何在僅使用匯編程序的硬件中完成位計數一樣。 –

回答

108

True等於1

>>> sum([True, True, False, False, False, True]) 
3 
+14

這不是慣用的,並且使bool的類型強制「濫用」。 –

+15

@Jan Segre,沒有強制,bool是一個整數類型。 –

+13

@熊貓34,我檢查了'issubclass(bool,int)'實際上是成立的,所以沒有強制。 –

6

您可以使用sum()

>>> sum([True, True, False, False, False, True]) 
3 
35

如果你只關心不斷True,一個簡單的sum是好的。但是請記住,在Python中,其他值的計算方式也是True。一個更強大的解決方案是使用bool內置:

>>> l = [1, 2, True, False] 
>>> sum(bool(x) for x in l) 
3 

更新:下面是一個具有更加透明的優點另一部同樣強大的解決方案:

>>> sum(1 for x in l if x) 
3 

附: Python的瑣事:True可能是真實的,而不是1.警告:不要嘗試這個工作!

>>> True = 2 
>>> if True: print('true') 
... 
true 
>>> l = [True, True, False, True] 
>>> sum(l) 
6 
>>> sum(bool(x) for x in l) 
3 
>>> sum(1 for x in l if x) 
3 

更惡:

True = False 
+0

好吧,我看到你的例子,我看到它在做什麼。除了它的大聲笑,實際上是否有充分的理由去做你在這裏展示的東西? – acs

+0

是的,頂部。正如我所指出的,Python測試中的「真」(如在「if」語句中)比僅僅測試「真」更復雜。請參閱http://docs.python.org/py3k/library/stdtypes.html#truth。 「真實= 2」只是爲了強調「真實」的概念更加複雜;使用一些額外的代碼(即使用'bool()'),您可以使解決方案更強大,更通用。 –

+7

在Python 3中,'True'和'False'是關鍵字,你不能改變它們。 – ThePiercingPrince

1

我喜歡len([b for b in boollist if b is True])(或發電機表達式等價),因爲它是相當不言自明。比Ignacio Vazquez-Abrams提出的答案更少「神奇」。

或者,您也可以做到這一點,這還是假設布爾是可轉化爲int,但無法爲真值的假設: ntrue = sum(boollist)/int(True)

+0

您的解決方案至少有兩個問題。一,它遭受同樣的健壯性問題;你可以通過將測試改爲'if b'來修復。但是,更重要的是,您正在構建一個一次性列表,要求所有值一次存儲在內存中,並且不能在生成器表達式中使用'len'。最好避免這種做法,以便解決方案可以擴展。 –

+0

@Ned Deily:'如果b'完全錯誤。如果問題是關於評估爲True的項目,而不是真正的True布爾值,那將是正確的。不過,我想談談你的第二點。在那種情況下,有變量'sum(如果b爲boollist,b爲True,否則爲0)'。 – kampu

+0

正如我在其他地方指出的那樣,從OP問題來看,我是否真的意味着只計算bool類型的值爲1的對象,或者意味着評估爲真的更大且通常更有用的一組值。如果是前者,那麼身份測試是正確的方法,但它也是限制性的。無論如何,Python中的對象類型都是相當古怪的鴨子,這是該語言最近的補充。在任何情況下,我會盡量簡化:'總和(b在boollist中爲b,如果b爲真)' –

73

listcount方法:

>>> [True,True,False].count(True) 
2 
+1

如果還有0值,則不能計算錯誤值 – Kostanos

+2

您不能使用'sum'其他答案,如果你有其他「真」值除1或真或者。此外,問題並沒有提到「真」或「假」。 –

2

首先通過bool更安全。這是很容易做到:

>>> sum(map(bool,[True, True, False, False, False, True])) 
3 

然後你就趕上了Python認爲真或假到相應的水桶一切:

>>> allTrue=[True, not False, True+1,'0', ' ', 1, [0], {0:0}, set([0])] 
>>> list(map(bool,allTrue)) 
[True, True, True, True, True, True, True, True, True] 

如果你願意,你可以使用一個理解:

>>> allFalse=['',[],{},False,0,set(),(), not True, True-1] 
>>> [bool(i) for i in allFalse] 
[False, False, False, False, False, False, False, False, False] 
4

爲了完整起見(sum通常更可取),我想提一下,我們也可以使用filter來獲取真值。在通常情況下,filter接受函數作爲第一個參數,但是如果您通過None,它將過濾所有「真值」值。此功能多少有些令人吃驚,但有據可查的,並在兩個工作Python 2和3

版本之間的區別是,在Python 2 filter返回一個列表,所以我們可以使用len

>>> bool_list = [True, True, False, False, False, True] 
>>> filter(None, bool_list) 
[True, True, True] 
>>> len(filter(None, bool_list)) 
3 

但是在Python 3中,filter返回一個迭代器,所以我們不能使用len,如果我們想避免使用sum(出於任何原因),我們需要求助於將迭代器轉換爲列表(這使得這個少得多漂亮):

>>> bool_list = [True, True, False, False, False, True] 
>>> filter(None, bool_list) 
<builtins.filter at 0x7f64feba5710> 
>>> list(filter(None, bool_list)) 
[True, True, True] 
>>> len(list(filter(None, bool_list))) 
3