我有兩個蟒列表,薩姆元件僅當在一個單獨的布爾列表元素爲True
A = [ 1, 2, 3, 4, 5 ]
B = [ True, False, False, True, True ]
列表A和B是相同的長度。
我要總結僅在對應於B. 真正的元素,我知道我能做到這一點的東西,如元素:
sum([A[x] for x in xrange(len(A)) if B[x]])
,但我不知道是否有一個更優雅的解決方案那不涉及循環每個列表中的元素?
我有兩個蟒列表,薩姆元件僅當在一個單獨的布爾列表元素爲True
A = [ 1, 2, 3, 4, 5 ]
B = [ True, False, False, True, True ]
列表A和B是相同的長度。
我要總結僅在對應於B. 真正的元素,我知道我能做到這一點的東西,如元素:
sum([A[x] for x in xrange(len(A)) if B[x]])
,但我不知道是否有一個更優雅的解決方案那不涉及循環每個列表中的元素?
發電機表達+ 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
代碼
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)
>>> from itertools import compress
>>> sum(compress(A, B))
10
的itertools.compress
實行的是鏈接的頁面描述。這是短期和簡單,讓你不已經進口itertools
:
>>> sum(a for a, b in zip(A, B) if b)
10
OTOH,itertools.compress
是用C實現的,因此,應該快了
如果' A'和'B'在哪裏'numpy.array's。所有你必須做的:'A [B] .sum()'。 – Akavall