计算Python列表中真正的布尔值的数量
我有一个布尔的列表:
[True, True, False, False, False, True]
我正在寻找一种方法来计算列表中True的数量(所以在上面的例子中,我希望返回值是3 。我find了一些查找特定元素出现次数的例子,但是在那里一个更有效的方法来做这件事,因为我正在与布尔人工作? 我正在考虑类似于all或any类似的东西。
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)