Compter le nombre de vrais booléens dans une liste de pythons

j'ai une liste de booléens:

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

et je cherche un moyen de compter le nombre de True dans la liste (donc dans l'exemple ci-dessus, je veux que le retour soit 3 .) J'ai trouvé des exemples de recherche du nombre d'occurrences d'éléments spécifiques, mais y a-t-il un moyen plus efficace de le faire puisque je travaille avec des booléens? Je pense à quelque chose d'analogue à all ou any .

88
demandé sur Koray Tugay 2012-10-07 07:12:41

7 réponses

True est égal à 1 .

>>> sum([True, True, False, False, False, True])
3
133
répondu Ignacio Vazquez-Abrams 2012-10-07 03:13:56

list a une count la méthode:

>>> [True,True,False].count(True)
2
82
répondu Mark Tolonen 2012-10-07 06:57:39

si vous êtes seulement concerné par la constante True , un simple sum est très bien. Cependant, gardez à l'esprit que, dans Python d'autres valeurs évaluer comme True . Une solution plus robuste serait d'utiliser le bool builtin:

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

mise à jour: Voici une autre solution tout aussi robuste qui a l'avantage d'être plus transparente:

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

P. S. Python trivia: True pourrait être vrai sans être 1. Avertissement: n'essayez pas ceci à la de travail!

>>> 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

beaucoup plus de mal:

True = False
37
répondu Ned Deily 2012-10-07 20:40:02

vous pouvez utiliser sum() :

>>> sum([True, True, False, False, False, True])
3
6
répondu Blender 2012-10-07 03:14:16

juste pour être complet ( sum est généralement préférable), je voulais mentionner que nous pouvons également utiliser filter pour obtenir les valeurs vraies. Dans le cas habituel, filter accepte une fonction comme premier argument, mais si vous la Passez None , elle filtrera pour toutes les valeurs "vraies". Cette fonctionnalité est quelque peu surprenante, mais elle est bien documentée et fonctionne en Python 2 et 3.

la différence entre les versions, c'est qu'en Python 2 filter retourne une liste, de sorte que nous pouvons utiliser len :

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

mais en Python 3, filter renvoie un itérateur, donc nous ne pouvons pas utiliser len , et si nous voulons éviter d'utiliser sum (pour n'importe quelle raison) nous devons recourir à la conversion de l'itérateur en une liste (ce qui rend cela beaucoup moins joli):

>>> 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
4
répondu yoniLavi 2016-03-14 18:31:48

il est plus sûr de passer d'abord par bool . Cela se fait facilement:

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

alors vous attraperez tout ce que Python considère vrai ou faux dans le seau approprié:

>>> 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]

si vous préférez, vous pouvez utiliser une compréhension:

>>> allFalse=['',[],{},False,0,set(),(), not True, True-1]
>>> [bool(i) for i in allFalse]
[False, False, False, False, False, False, False, False, False]
2
répondu 2012-10-08 20:38:16

je préfère len([b for b in boollist if b is True]) (ou l'équivalent de l'expression génératrice), car c'est assez explicite. Moins "magique" que la réponse proposée par Ignacio Vazquez-Abrams.

alternativement, vous pouvez le faire, ce qui suppose toujours que bool est convertible en int, mais ne fait aucune hypothèse sur la valeur de True: ntrue = sum(boollist) / int(True)

1
répondu kampu 2012-10-08 06:42:44