182

ブール値のリストがあります:

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

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

4

8 に答える 8

249

Trueに等しい1です。

>>> sum([True, True, False, False, False, True])
3
于 2012-10-07T03:13:56.973 に答える
196

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)
于 2012-10-07T06:57:39.083 に答える
47

定数のみに関心がある場合は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
于 2012-10-07T03:56:50.573 に答える
8

使用できますsum()

>>> sum([True, True, False, False, False, True])
3
于 2012-10-07T03:14:16.643 に答える
5

完全を期すために (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
于 2016-03-14T18:31:48.380 に答える
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]
于 2012-10-08T20:38:16.683 に答える
1

len([b for b in boollist if b is True])一目瞭然なので、私は(またはジェネレーター式の同等物)を好みます。Ignacio Vazquez-Abrams が提案した答えよりも「魔法的」ではありません。

または、これを行うこともできます。これは、bool が int に変換可能であると想定していますが、True の値については想定していません。 ntrue = sum(boollist) / int(True)

于 2012-10-07T04:22:57.463 に答える