2014-09-02 2 views
1

У меня есть список длины L, с некоторыми случайными значениями:Sum элементы списка, используя условие на индексах

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

и другой список той же длины, с булевыми значениями

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

I хотите суммировать значения list1, где соответствующий элемент list2 - 1. (в этом случае 6 + 8 + 3)

есть ли простой способ сделать это на Python?

+0

Что вы наделали? Вы предпринимали какие-либо попытки решить проблему ?. Также возможно Дубликат [Как добавить соответствующие элементы нескольких списков чисел?] (Http://stackoverflow.com/questions/11280536/how-can-i-add-the-corresponding-elements-of- несколько-листы, из-чисел) – cyberbemon

ответ

2

Да, с помощью sum и itertools.compress:

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

Объяснение:compress() принимает два итерируемых, и дает элементы из первой, если соответствующий элемент второго - правдивый. sum() ... ну, наверное, можно догадаться.

4

Вы можете использовать itertools.compress с sum:

>>> 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 
Смежные вопросы