У меня есть список логических:
[True, True, False, False, False, True]
и я ищу способ подсчитать количество True
в списке (поэтому в приведенном выше примере я хочу, чтобы возвращение было 3
.) Я нашел примеры поиска количества вхождений определенных элементов, но есть ли более эффективный способ сделать это, так как я работаю с Booleans? Я думаю о чем-то аналогичном all
или any
.
Ответы:
True
равно1
.источник
issubclass(bool, int)
фактически держит, так что никакого принуждения нет.list
имеетcount
метод:Это на самом деле более эффективно, чем
sum
и более ясно о намерениях, поэтому нет смысла использоватьsum
:источник
sum
другой ответ, если у вас есть другие "истинные" значения кроме 1 или True либо. Кроме того, тогда вопрос не упоминал ничего кромеTrue
илиFalse
.Если вас интересует только константа
True
, простойsum
- это хорошо. Однако имейте в виду, что в Python оцениваются и другие значенияTrue
. Более надежным решением будет использованиеbool
встроенного:ОБНОВЛЕНИЕ: Вот еще одно столь же надежное решение, которое имеет преимущество в большей прозрачности:
PS Пустяки Python:
True
может быть правдой, не будучи 1. Предупреждение: не пытайтесь это на работе!Гораздо больше зла
источник
if
утверждении) сложнее, чем просто проверкаTrue
. См. Docs.python.org/py3k/library/stdtypes.html#truth . ЭтоTrue = 2
было только для того, чтобы подчеркнуть, что понятие «правда» является более сложным; добавив немного кода (т.е. используяbool()
), вы можете сделать решение более надежным и общим.True
иFalse
ключевые слова, и вы не можете их изменить.Вы можете использовать
sum()
:источник
Просто ради полноты (
sum
обычно это предпочтительнее) я хотел бы упомянуть, что мы также можем использоватьfilter
для получения истинных значений. В обычном случае,filter
принимает функцию в качестве первого аргумента, но если вы передадите ееNone
, она отфильтрует все истинные значения. Эта функция несколько удивительна, но хорошо документирована и работает как в Python 2, так и в 3.Разница между версиями заключается в том, что в Python 2
filter
возвращается список, поэтому мы можем использоватьlen
:Но в Python 3
filter
возвращает итератор, поэтому мы не можем его использоватьlen
, и если мы хотим избежать использованияsum
(по любой причине), нам нужно прибегнуть к преобразованию итератора в список (что делает это намного менее привлекательным):источник
Прочитав все ответы и комментарии по этому вопросу, я подумал сделать небольшой эксперимент.
Я создал 50000 случайных булевы и называется
sum
иcount
на них.Вот мои результаты:
Просто чтобы быть уверенным, я повторил это еще несколько раз:
И, как вы можете видеть,
count
это в 3 раза быстрее, чемsum
. Поэтому я бы предложил использоватьcount
как я сделал вcount_it
.Версия Python: 3.6.7
Ядра процессора: 4 Объем
оперативной памяти: 16 ГБ
ОС: Ubuntu 18.04.1 LTS
источник
Безопаснее пробежать
bool
первым. Это легко сделать:Затем вы поймаете все, что Python считает True или False, в соответствующее ведро:
Если вы предпочитаете, вы можете использовать понимание:
источник
Я предпочитаю
len([b for b in boollist if b is True])
(или эквивалент выражения генератора), поскольку это довольно очевидно. Менее «волшебный», чем ответ, предложенный Игнасио Васкесом-Абрамсом.В качестве альтернативы, вы можете сделать это, в котором все еще предполагается, что bool конвертируется в int, но не делается никаких предположений о значении True:
ntrue = sum(boollist) / int(True)
источник
if b
. Но, что более важно, вы создаете одноразовый список, требующий, чтобы все значения были в памяти одновременно, и вы не можете использовать егоlen
с выражением генератора. Лучше избегать такой практики, чтобы решение могло масштабироваться.if b
совершенно неправильно. Было бы правильно, если бы вопрос был об элементах, которые оцениваются как Истина, а не фактические Истинные логические значения. Я понимаю ваше второе замечание. В таком случае есть вариантsum(1 if b is True else 0 for b in boollist)
.sum(1 for b in boollist if b is True)