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
.
7 réponses
True
est égal à 1
.
>>> sum([True, True, False, False, False, True])
3
list
a une count
la méthode:
>>> [True,True,False].count(True)
2
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
vous pouvez utiliser sum()
:
>>> sum([True, True, False, False, False, True])
3
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
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]
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)