我有两个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]])
但我想知道是否有一个更优雅的解决方案,不涉及循环每个列表中的元素?
答案 0 :(得分:6)
>>> 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)