values - Contando el número de Booleanos Verdaderos en una lista de Python
python boolean values (7)
Tengo una lista de Booleanos:
[True, True, False, False, False, True]
y estoy buscando una forma de contar el número de True
en la lista (por lo tanto, en el ejemplo anterior, quiero que el resultado sea 3
). He encontrado ejemplos de buscar el número de apariciones de elementos específicos, pero hay una forma más eficiente de hacerlo ya que estoy trabajando con booleanos? Estoy pensando en algo análogo a all
o any
.
Es más seguro pasar primero por bool
. Esto se hace fácilmente:
>>> sum(map(bool,[True, True, False, False, False, True]))
3
Luego, detectará todo lo que Python considere Verdadero o Falso en el depósito apropiado:
>>> 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 lo prefiere, puede usar una comprensión:
>>> allFalse=['''',[],{},False,0,set(),(), not True, True-1]
>>> [bool(i) for i in allFalse]
[False, False, False, False, False, False, False, False, False]
Prefiero len([b for b in boollist if b is True])
(o el equivalente de expresión de generador), ya que es bastante len([b for b in boollist if b is True])
. Menos ''mágico'' que la respuesta propuesta por Ignacio Vázquez-Abrams.
Alternativamente, puede hacer esto, que aún asume que bool es convertible a int, pero no hace suposiciones sobre el valor de True: ntrue = sum(boollist) / int(True)
Puedes usar sum()
:
>>> sum([True, True, False, False, False, True])
3
Si solo te preocupa la constante True
, una simple sum
está bien. Sin embargo, tenga en cuenta que en Python otros valores también se evalúan como True
. Una solución más robusta sería usar el bool
incorporado:
>>> l = [1, 2, True, False]
>>> sum(bool(x) for x in l)
3
ACTUALIZACIÓN: Aquí hay otra solución igualmente robusta que tiene la ventaja de ser más transparente:
>>> sum(1 for x in l if x)
3
Curiosidades de PS Python: True
podría ser cierto sin ser 1. Advertencia: ¡no intentes esto en el trabajo!
>>> 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
Mucho más malvado:
True = False
Solo por completitud (generalmente, la sum
es preferible), quería mencionar que también podemos usar el filter
para obtener los valores verdaderos. En el caso habitual, filter
acepta una función como primer argumento, pero si la pasa None
, filtrará todos los valores de "veracidad". Esta característica es algo sorprendente, pero está bien documentada y funciona en Python 2 y 3.
La diferencia entre las versiones es que en Python 2 el filter
devuelve una lista, entonces podemos usar len
:
>>> bool_list = [True, True, False, False, False, True]
>>> filter(None, bool_list)
[True, True, True]
>>> len(filter(None, bool_list))
3
Pero en Python 3, el filter
devuelve un iterador, por lo que no podemos usar len
, y si queremos evitar usar sum
(por alguna razón) necesitamos recurrir a convertir el iterador a una lista (lo que hace que esto no sea tan bonito) :
>>> 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
True
es igual a 1
.
>>> sum([True, True, False, False, False, True])
3
list
tiene un método de count
:
>>> [True,True,False].count(True)
2