计算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)