计算Python列表中的True Booleans数量

acs*_*acs 129 python boolean list counting

我有一个布尔列表:

[True, True, False, False, False, True]
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来计算True列表中的数量(所以在上面的例子中,我希望返回3.)我找到了寻找特定元素出现次数的例子,但还有更多我和Booleans一起工作的有效方法呢?我想的东西类似allany.

Ign*_*ams 183

True等于1.

>>> sum([True, True, False, False, False, True])
3
Run Code Online (Sandbox Code Playgroud)

  • 这不是惯用的,并且会滥用bool类型的强制行为. (22认同)
  • @Jan Segre,没有强制,bool是整数类型. (20认同)
  • @ panda-34,我查了一下`issubclass(bool,int)`实际上是持有的,所以没有强制. (20认同)

Mar*_*nen 121

list有一个count方法:

>>> [True,True,False].count(True)
2
Run Code Online (Sandbox Code Playgroud)

这实际上更有效sum,并且更明确地表达了意图,因此没有理由使用sum:

In [1]: import random

In [2]: x = [random.choice([True, False]) for i in range(100)]

In [3]: %timeit x.count(True)
970 ns ± 41.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %timeit sum(x)
1.72 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Run Code Online (Sandbox Code Playgroud)

  • 如果除了1或True之外还有其他"真实"值,则不能使用其他答案的"sum".此外,然后问题没有提到"真"或"假". (9认同)
  • 如果也有0值,我就无法计算False值 (2认同)

Ned*_*ily 39

如果你只关心常数True,那么简单sum就好了.但是,请记住,在Python中,其他值True也会进行评估.一个更强大的解决方案是使用bool内置:

>>> l = [1, 2, True, False]
>>> sum(bool(x) for x in l)
3
Run Code Online (Sandbox Code Playgroud)

更新:这是另一个同样强大的解决方案,具有更透明的优势:

>>> sum(1 for x in l if x)
3
Run Code Online (Sandbox Code Playgroud)

PS Python琐事:如果不是1,True 可能是真的.警告:不要在工作中尝试这个!

>>> 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
Run Code Online (Sandbox Code Playgroud)

更邪恶的是:

True = False
Run Code Online (Sandbox Code Playgroud)

  • 在Python 3中,"True"和"False"是关键字,您无法更改它们. (9认同)
  • 是的,对于顶部。正如我所指出的,Python 测试“true”(如在 `if` 语句中)比仅仅测试 `True` 更复杂。请参阅 http://docs.python.org/py3k/library/stdtypes.html#truth。`True = 2` 只是为了强调“真”的概念更复杂;通过一些额外的代码(即使用`bool()`),您可以使解决方案更健壮和更通用。 (2认同)

Ble*_*der 8

你可以使用sum():

>>> sum([True, True, False, False, False, True])
3
Run Code Online (Sandbox Code Playgroud)


小智 6

看完这个问题的所有答案和评论后,我想做一个小实验。

我产生50000个随机布尔值,并呼吁sumcount他们。

这是我的结果:

>>> a = [bool(random.getrandbits(1)) for x in range(50000)]
>>> len(a)
50000
>>> a.count(False)
24884
>>> a.count(True)
25116
>>> def count_it(a):
...   curr = time.time()
...   counting = a.count(True)
...   print("Count it = " + str(time.time() - curr))
...   return counting
... 
>>> def sum_it(a):
...   curr = time.time()
...   counting = sum(a)
...   print("Sum it = " + str(time.time() - curr))
...   return counting
... 
>>> count_it(a)
Count it = 0.00121307373046875
25015
>>> sum_it(a)
Sum it = 0.004102230072021484
25015
Run Code Online (Sandbox Code Playgroud)

可以肯定的是,我又重复了几次:

>>> count_it(a)
Count it = 0.0013530254364013672
25015
>>> count_it(a)
Count it = 0.0014507770538330078
25015
>>> count_it(a)
Count it = 0.0013344287872314453
25015
>>> sum_it(a)
Sum it = 0.003480195999145508
25015
>>> sum_it(a)
Sum it = 0.0035257339477539062
25015
>>> sum_it(a)
Sum it = 0.003350496292114258
25015
>>> sum_it(a)
Sum it = 0.003744363784790039
25015
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,count比 快 3 倍sum。所以我建议count像我在count_it.

Python 版本:3.6.7
CPU 内核:4
RAM 大小:16 GB
操作系统:Ubuntu 18.04.1 LTS


yon*_*avi 5

仅出于完整性考虑(sum通常更可取),我想提一下我们也可以filter用来获取真实值。在通常情况下,filter接受一个函数作为第一个参数,但是如果传递它None,它将为所有“真实的”值过滤。这个功能有些令人惊讶,但是有充分的文档记录,并且可以在Python 2和3中使用。

这两个版本之间的区别在于,在Python 2中filter返回一个列表,因此我们可以使用len

>>> bool_list = [True, True, False, False, False, True]
>>> filter(None, bool_list)
[True, True, True]
>>> len(filter(None, bool_list))
3
Run Code Online (Sandbox Code Playgroud)

但是在Python 3中,filter返回了一个迭代器,因此我们不能使用len,并且如果我们想避免使用sum(出于任何原因),我们需要求助于将迭代器转换为列表(这会使它变得不那么美观):

>>> 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
Run Code Online (Sandbox Code Playgroud)