ブール値のリストがあります:
[True, True, False, False, False, True]
リスト内のの数をカウントする方法を探していTrue
ます (したがって、上記の例では、戻り値を にしたいのです3
。) 特定の要素の出現回数を探す例を見つけましたが、もっと私はブール値を扱っているので、それを行う効率的な方法は? all
orに似たものを考えていany
ます。
True
に等しい1
です。
>>> sum([True, True, False, False, False, True])
3
list
メソッドがありcount
ます:
>>> [True,True,False].count(True)
2
これは実際には よりも効率的でありsum
、意図がより明確であるため、 を使用する理由はありませんsum
:
In [1]: import random
In [2]: x = [random.choice([True, False]) for i in range(100)]
In [3]: %timeit x.count(True)
970 ns ± 41.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [4]: %timeit sum(x)
1.72 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
定数のみに関心がある場合は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
PS Python トリビア: 1 でなくても真であるTrue
可能性があります。警告: 職場でこれを試さないでください。
>>> 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
使用できますsum()
:
>>> sum([True, True, False, False, False, True])
3
完全を期すために (sum
通常は が望ましい)、 を使用して真の値を取得することもできることに言及したいとfilter
思います。通常、filter
は最初の引数として関数を受け入れますがNone
、それを渡すと、すべての「真の」値をフィルタリングします。この機能はやや驚くべきものですが、十分に文書化されており、Python 2 と 3 の両方で動作します。
バージョン間の違いは、Python 2filter
ではリストを返すため、以下を使用できること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
最初に駆け抜ける方が安全bool
です。これは簡単にできます:
>>> sum(map(bool,[True, True, False, False, False, True]))
3
次に、Python が True または False と見なすすべてのものを適切なバケットにキャッチします。
>>> 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]
len([b for b in boollist if b is True])
一目瞭然なので、私は(またはジェネレーター式の同等物)を好みます。Ignacio Vazquez-Abrams が提案した答えよりも「魔法的」ではありません。
または、これを行うこともできます。これは、bool が int に変換可能であると想定していますが、True の値については想定していません。
ntrue = sum(boollist) / int(True)