Tengo una lista de booleanos:
[True, True, False, False, False, True]
y estoy buscando una manera de contar el número de True
en la lista (así que en el ejemplo anterior, quiero que sea el retorno 3
). He encontrado ejemplos de cómo buscar el número de ocurrencias de elementos específicos, pero ¿hay más? forma eficiente de hacerlo ya que estoy trabajando con booleanos? Estoy pensando en algo análogo a all
o any
.
Respuestas:
True
es igual a1
.fuente
issubclass(bool, int)
de hecho, se mantiene, así que no hay coerción.list
tiene uncount
método:En realidad, esto es más eficiente que
sum
, además de ser más explícito sobre la intención, por lo que no hay razón para usarsum
:fuente
sum
la otra respuesta si tiene otros valores "verdaderos" además de 1 o Verdadero. Además, la pregunta no menciona nada más queTrue
oFalse
.Si solo le preocupa la constante
True
, un simplesum
está bien. Sin embargo, tenga en cuenta que en Python también se evalúan otros valoresTrue
. Una solución más robusta sería usar elbool
incorporado:ACTUALIZACIÓN: Aquí hay otra solución igualmente robusta que tiene la ventaja de ser más transparente:
Curiosidades de PS Python:
True
podría ser cierto sin ser 1. Advertencia: ¡no intentes esto en el trabajo!Mucho más malvado:
fuente
if
declaración) es más complicada que simplemente probarTrue
. Ver docs.python.org/py3k/library/stdtypes.html#truth . ElTrue = 2
era sólo para reforzar el concepto de "verdad" es más complejo; con un poco de código adicional (es decir, usandobool()
) puede hacer que la solución sea más robusta y más general.True
yFalse
son palabras clave y no puede cambiarlas.Puedes usar
sum()
:fuente
Solo por el bien de la integridad (
sum
generalmente es preferible), quería mencionar que también podemos usarfilter
para obtener los valores de verdad. En el caso habitual,filter
acepta una función como primer argumento, pero si la pasaNone
, filtrará todos los valores "verdaderos". Esta característica es algo sorprendente, pero está bien documentada y funciona tanto en Python 2 como en 3.La diferencia entre las versiones es que en Python 2
filter
devuelve una lista, por lo que podemos usarlen
:Pero en Python 3,
filter
devuelve un iterador, por lo que no podemos usarlolen
, y si queremos evitar el usosum
(por cualquier motivo) debemos recurrir a convertir el iterador en una lista (lo que hace que esto sea mucho menos bonito):fuente
Después de leer todas las respuestas y comentarios sobre esta pregunta, pensé en hacer un pequeño experimento.
Generé 50,000 booleanos aleatorios y llamé
sum
ycount
sobre ellos.Aquí están mis resultados:
Solo para estar seguro, lo repetí varias veces más:
Y como puedes ver,
count
es 3 veces más rápido quesum
. Por lo tanto, sugeriría usarcount
como lo hice encount_it
.Versión de Python: 3.6.7
Núcleos de CPU: 4
Tamaño de RAM: 16 GB
SO: Ubuntu 18.04.1 LTS
fuente
Es más seguro correr
bool
primero. Esto se hace fácilmente:Luego, capturará todo lo que Python considera Verdadero o Falso en el cubo apropiado:
Si lo prefiere, puede usar una comprensión:
fuente
Prefiero
len([b for b in boollist if b is True])
(o el equivalente de la expresión del generador), ya que se explica por sí mismo. 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)
fuente
if b
. Pero, lo que es más importante, está construyendo una lista de descarte que requiere que todos los valores estén en la memoria a la vez y no se puede usarlen
con una expresión generadora. Es mejor evitar tales prácticas para que la solución pueda escalar.if b
está exactamente equivocado. Solo sería correcto si la pregunta fuera sobre elementos que evalúan como Verdaderos, en lugar de booleanos verdaderos reales. Sin embargo, tomo tu segundo punto. En ese caso está la variantesum(1 if b is True else 0 for b in boollist)
.sum(1 for b in boollist if b is True)