variable values problems bool array python list boolean counting

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