ブール値のリストがあります:
[True, True, False, False, False, True]
リスト内のの数をカウントする方法を探していTrueます (したがって、上記の例では、戻り値を にしたいのです3。) 特定の要素の出現回数を探す例を見つけましたが、もっと私はブール値を扱っているので、それを行う効率的な方法は? allorに似たものを考えてい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)