Элементы sum в списке python только в том случае, если элементы в отдельном булевом списке True

У меня есть два списка python,

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

списки A и B имеют одинаковую длину.

Я хочу суммировать только те элементы в A, которые соответствуют элементам True в B. Я знаю, что могу сделать это с чем-то вроде:

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

но мне было интересно, было ли более элегантное решение, которое не включало бы цикл над элементами в каждом списке?

3 Solutions collect form web for “Элементы sum в списке python только в том случае, если элементы в отдельном булевом списке True”

Использование 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, и поэтому должен быть быстрее

Выражение генератора + 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) 
  • Элегантный способ удаления элементов в списке, которые не имеют подстрок, которые отображаются в другом списке
  • Понимание переменных нескольких переменных
  • Поиск и группировка анаграмм Python
  • Python, работающий со списком
  • Учет списка, проверьте, уникален ли элемент
  • Учет списков в Python: установите все элементы в массиве в 0 или 1
  • list.extend и понимание списка
  • Удалите четное / нечетное число из нечетного / четного списка Python.
  • Python - лучший язык программирования в мире.