计算Python列表中真正的布尔值的数量

我有一个布尔的列表:

[True, True, False, False, False, True] 

我正在寻找一种方法来计算列表中True的数量(所以在上面的例子中,我希望返回值是3 。我find了一些查找特定元素出现次数的例子,但是在那里一个更有效的方法来做这件事,因为我正在与布尔人工作? 我正在考虑类似于allany类似的东西。

True等于1

 >>> sum([True, True, False, False, False, True]) 3 

list有一个count方法:

 >>> [True,True,False].count(True) 2 

如果你只关心常量True ,那么简单的sum就好了。 但是请记住,在Python中,其他值的计算结果也是True 。 更强大的解决scheme将是使用bool内置:

 >>> l = [1, 2, True, False] >>> sum(bool(x) for x in l) 3 

更新:这是另一个类似的强大的解决scheme,具有更透明的优势:

 >>> sum(1 for x in l if x) 3 

PS Python琐事:没有1就是真的。警告:不要在工作中尝试这个!

 >>> 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 

更恶毒:

 True = False 

你可以使用sum()

 >>> sum([True, True, False, False, False, True]) 3 

为了完整性( sum通常是可取的),我想提一下,我们也可以使用filter来获得真值。 在通常情况下, filter接受一个函数作为第一个参数,但是如果您将它传递给None ,它将过滤所有“真值”值。 这个function有点令人惊讶,但是有很好的文档logging,可以在Python 2和Python 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 

但在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 

首先运行bool更安全。 这很容易完成:

 >>> sum(map(bool,[True, True, False, False, False, True])) 3 

然后你会把Python认为True或False的所有东西都放到合适的桶中:

 >>> 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] 

如果你愿意,你可以使用理解:

 >>> allFalse=['',[],{},False,0,set(),(), not True, True-1] >>> [bool(i) for i in allFalse] [False, False, False, False, False, False, False, False, False] 

我更喜欢len([b for b in boollist if b is True]) (或者相当于generator-expression),因为它很容易理解。 比伊格纳西奥·巴斯克斯 – 艾布拉姆斯(Ignacio Vazquez-Abrams)提出的答案更“神奇”。

或者,你可以这样做,它仍然假定bool可以转换为int,但是不会假设True的值: ntrue = sum(boollist) / int(True)