Tengo una lista de booleanos:
[True, True, False, False, False, True]y estoy buscando una manera de contar el número de Trueen 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 allo any.

Respuestas:
Truees igual a1.fuente
issubclass(bool, int)de hecho, se mantiene, así que no hay coerción.listtiene uncountmé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
sumla otra respuesta si tiene otros valores "verdaderos" además de 1 o Verdadero. Además, la pregunta no menciona nada más queTrueoFalse.Si solo le preocupa la constante
True, un simplesumestá 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 elboolincorporado:ACTUALIZACIÓN: Aquí hay otra solución igualmente robusta que tiene la ventaja de ser más transparente:
Curiosidades de PS Python:
Truepodría ser cierto sin ser 1. Advertencia: ¡no intentes esto en el trabajo!Mucho más malvado:
fuente
ifdeclaración) es más complicada que simplemente probarTrue. Ver docs.python.org/py3k/library/stdtypes.html#truth . ElTrue = 2era 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.TrueyFalseson palabras clave y no puede cambiarlas.Puedes usar
sum():fuente
Solo por el bien de la integridad (
sumgeneralmente es preferible), quería mencionar que también podemos usarfilterpara obtener los valores de verdad. En el caso habitual,filteracepta 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
filterdevuelve una lista, por lo que podemos usarlen:Pero en Python 3,
filterdevuelve 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é
sumycountsobre ellos.Aquí están mis resultados:
Solo para estar seguro, lo repetí varias veces más:
Y como puedes ver,
countes 3 veces más rápido quesum. Por lo tanto, sugeriría usarcountcomo 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
boolprimero. 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 usarlencon una expresión generadora. Es mejor evitar tales prácticas para que la solución pueda escalar.if bestá 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)