仅当单独的布尔列表中的元素为True时,才会对python列表中的元素求和

时间:2016-04-08 16:31:07

标签: python boolean comparison list-comprehension

我有两个python列表,

A = [ 1, 2, 3, 4, 5 ]
B = [ True, False, False, True, True ]

列表A和B的长度相同。

我想只计算A中与B中的True元素对应的元素。 我知道我可以用以下的方式做到这一点:

sum([A[x] for x in xrange(len(A)) if B[x]])

但我想知道是否有一个更优雅的解决方案,不涉及循环每个列表中的元素?

3 个答案:

答案 0 :(得分:6)

使用itertools.compress

>>> from itertools import compress
>>> sum(compress(A, B))
10

链接页面上描述了itertools.compress的实现。它简短,所以你不 导入itertools 1

>>> sum(a for a, b in zip(A, B) if b)
10

1 OTOH,itertools.compress在C中实现,因此应该更快

答案 1 :(得分:2)

生成器表达式+ sum

>>> A = [1, 2, 3, 4, 5]
>>> B = [True, False, False, True, True]
>>> sum(a for a,b in zip(A, B) if b)
10

答案 2 :(得分:1)

<强>代码

A = [ 1, 2, 3, 4, 5 ]
B = [ True, False, False, True, True ]

sum_ = sum([numa for (numa, numb) in zip(A, B) if numb])
print(sum_)

<强>退出

10

工作原理:

如果我们进一步扩展列表理解,我们可以更清楚地看到发生的事情。

nums_to_sum = []
for numa, numb in zip(A, B):
     if numb:
         nums_to_sum.append(numa)
sum_ = sum(nums_to_sum)
相关问题