Eu tenho uma lista de booleanos:
[True, True, False, False, False, True]
e estou procurando uma maneira de contar o número da True
lista (por isso, no exemplo acima, quero que o retorno seja 3
). Encontrei exemplos de como procurar o número de ocorrências de elementos específicos, mas há mais maneira eficiente de fazer isso, pois estou trabalhando com booleanos? Estou pensando em algo análogo a all
ou any
.
Respostas:
True
é igual a1
.fonte
issubclass(bool, int)
, de fato, detém, então não há coerção.list
tem umcount
método:Isso é realmente mais eficiente do que
sum
, além de ser mais explícito sobre a intenção, portanto não há razão para usarsum
:fonte
sum
a outra resposta se tiver outros valores "verdadeiros" além de 1 ou Verdadeiro. Além disso, então a pergunta não mencionou nada além deTrue
ouFalse
.Se você está preocupado apenas com a constante
True
, um simplessum
é bom. No entanto, lembre-se de que no Python outros valores também são avaliadosTrue
. Uma solução mais robusta seria usar obool
builtin:ATUALIZAÇÃO: Aqui está outra solução igualmente robusta que tem a vantagem de ser mais transparente:
Curiosidades PS Python:
True
poderia ser verdade sem ser 1. Aviso: não tente fazer isso no trabalho!Muito mais maldade:
fonte
if
declaração) é mais complicado do que apenas testarTrue
. Consulte docs.python.org/py3k/library/stdtypes.html#truth . OTrue = 2
era apenas para reforçar que o conceito de "verdade" é mais complexa; com um pouco de código extra (ou seja, usandobool()
), você pode tornar a solução mais robusta e mais geral.True
eFalse
são palavras-chave e você não pode alterá-los.Você pode usar
sum()
:fonte
Por uma questão de completude (
sum
geralmente é preferível), eu queria mencionar que também podemos usarfilter
para obter os valores verdadeiros. No caso usual,filter
aceita uma função como o primeiro argumento, mas se você a passarNone
, ela filtrará todos os valores "verdade". Esse recurso é um tanto surpreendente, mas está bem documentado e funciona em Python 2 e 3.A diferença entre as versões é que no Python 2
filter
retorna uma lista, para que possamos usarlen
:Mas no Python 3,
filter
retorna um iterador, portanto não podemos usá-lolen
e, se queremos evitar o usosum
(por qualquer motivo), precisamos recorrer à conversão do iterador em uma lista (o que torna muito menos bonito):fonte
Depois de ler todas as respostas e comentários sobre essa pergunta, pensei em fazer um pequeno experimento.
I gerados 50.000 booleans aleatórios e chamado
sum
ecount
sobre eles.Aqui estão meus resultados:
Só para ter certeza, repeti várias vezes:
E como você pode ver,
count
é 3 vezes mais rápido quesum
. Então, eu sugeriria usarcount
como fizcount_it
.Versão Python: 3.6.7
Núcleos da CPU: 4
Tamanho da RAM: 16 GB
SO: Ubuntu 18.04.1 LTS
fonte
É mais seguro percorrer
bool
primeiro. Isso é feito facilmente:Então, você capturará tudo o que o Python considerar Verdadeiro ou Falso no intervalo apropriado:
Se preferir, você pode usar uma compreensão:
fonte
Eu prefiro
len([b for b in boollist if b is True])
(ou o equivalente da expressão geradora), pois é bastante auto-explicativo. Menos 'mágico' do que a resposta proposta por Ignacio Vazquez-Abrams.Como alternativa, você pode fazer isso, que ainda assume que o bool é convertível em int, mas não faz suposições sobre o valor de True:
ntrue = sum(boollist) / int(True)
fonte
if b
. Mas, mais importante, você está construindo uma lista descartável que exige que todos os valores estejam na memória de uma só vez e não pode ser usadalen
com uma expressão geradora. Melhor evitar essas práticas para que a solução possa ser dimensionada.if b
está exatamente errado. Seria correto se a pergunta fosse sobre itens avaliados como True, em vez de verdadeiros booleanos. No entanto, entendo o seu segundo ponto. Nesse caso, há a variantesum(1 if b is True else 0 for b in boollist)
.sum(1 for b in boollist if b is True)