2014-09-02 94 views
1

我有長度L的列表,與一些隨機值:薩姆元件

list1 = [3, 1, 1, 6, 8, 3, 7, 4, 8, 4] 

和相同長度的另一列表,以及布爾值

list2 = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0] 

我想要總和list1的值,其中 list2的對應元素是1。 (在這種情況下6 + 8 + 3)

有沒有一種簡單的方法來使它在Python?

+0

你做了什麼?你有沒有試圖解決這個問題? 也可能重複[如何添加幾個數字列表的相應元素?](http://stackoverflow.com/questions/11280536/how-can-i-add-the-corresponding-elements-of-幾家名單-的號碼) – cyberbemon 2014-09-02 15:58:16

回答

2

是,使用sumitertools.compress

>>> from itertools import compress 
>>> sum(compress(list1, list2)) 
17 

說明:compress()需要兩個iterables,併產生從第一要素,如果相應的第二個元素是真理。 sum() ......好吧,你大概可以猜到。

4

您可以使用itertools.compresssum

>>> import itertools 
>>> list1 = [3, 1, 1, 6, 8, 3, 7, 4, 8, 4] 
>>> list2 = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0] 
>>> list(itertools.compress(list1, list2)) 
[6, 8, 3] 
>>> sum(itertools.compress(list1, list2)) 
17 
0

你也可以做一個有條件的理解與zip

>>> list1 = [3, 1, 1, 6, 8, 3, 7, 4, 8, 4] 
>>> list2 = [0, 0, 0, 1, 1, 1, 0, 0, 0, 0] 

>>> sum(item for item, flag in zip(list1, list2) if flag) 
17 

if flag檢查相應的項目不爲零。如果你想明確檢查1

>>> sum(item for item, flag in zip(list1, list2) if flag == 1) 
17