真布爾的數量我有布爾列表:計數在Python列表
[True, True, False, False, False, True]
,我要尋找一個方法來計算的True
數量在列表中(所以在上面的例子中,我想返回到3
。)我找到了一些尋找特定元素出現次數的例子,但是因爲我正在使用布爾值,所以有更高效的方法去做嗎?我正在考慮類似於all
或any
的東西。
真布爾的數量我有布爾列表:計數在Python列表
[True, True, False, False, False, True]
,我要尋找一個方法來計算的True
數量在列表中(所以在上面的例子中,我想返回到3
。)我找到了一些尋找特定元素出現次數的例子,但是因爲我正在使用布爾值,所以有更高效的方法去做嗎?我正在考慮類似於all
或any
的東西。
True
等於1
。
>>> sum([True, True, False, False, False, True])
3
這不是慣用的,並且使bool的類型強制「濫用」。 –
@Jan Segre,沒有強制,bool是一個整數類型。 –
@熊貓34,我檢查了'issubclass(bool,int)'實際上是成立的,所以沒有強制。 –
您可以使用sum()
:
>>> sum([True, True, False, False, False, True])
3
如果你只關心不斷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
好吧,我看到你的例子,我看到它在做什麼。除了它的大聲笑,實際上是否有充分的理由去做你在這裏展示的東西? – acs
是的,頂部。正如我所指出的,Python測試中的「真」(如在「if」語句中)比僅僅測試「真」更復雜。請參閱http://docs.python.org/py3k/library/stdtypes.html#truth。 「真實= 2」只是爲了強調「真實」的概念更加複雜;使用一些額外的代碼(即使用'bool()'),您可以使解決方案更強大,更通用。 –
在Python 3中,'True'和'False'是關鍵字,你不能改變它們。 – ThePiercingPrince
我喜歡len([b for b in boollist if b is True])
(或發電機表達式等價),因爲它是相當不言自明。比Ignacio Vazquez-Abrams提出的答案更少「神奇」。
或者,您也可以做到這一點,這還是假設布爾是可轉化爲int,但無法爲真值的假設: ntrue = sum(boollist)/int(True)
您的解決方案至少有兩個問題。一,它遭受同樣的健壯性問題;你可以通過將測試改爲'if b'來修復。但是,更重要的是,您正在構建一個一次性列表,要求所有值一次存儲在內存中,並且不能在生成器表達式中使用'len'。最好避免這種做法,以便解決方案可以擴展。 –
@Ned Deily:'如果b'完全錯誤。如果問題是關於評估爲True的項目,而不是真正的True布爾值,那將是正確的。不過,我想談談你的第二點。在那種情況下,有變量'sum(如果b爲boollist,b爲True,否則爲0)'。 – kampu
正如我在其他地方指出的那樣,從OP問題來看,我是否真的意味着只計算bool類型的值爲1的對象,或者意味着評估爲真的更大且通常更有用的一組值。如果是前者,那麼身份測試是正確的方法,但它也是限制性的。無論如何,Python中的對象類型都是相當古怪的鴨子,這是該語言最近的補充。在任何情況下,我會盡量簡化:'總和(b在boollist中爲b,如果b爲真)' –
list
有count
方法:
>>> [True,True,False].count(True)
2
如果還有0值,則不能計算錯誤值 – Kostanos
您不能使用'sum'其他答案,如果你有其他「真」值除1或真或者。此外,問題並沒有提到「真」或「假」。 –
首先通過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]
爲了完整起見(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
就像記住如何在僅使用匯編程序的硬件中完成位計數一樣。 –