Как суммировать умножение всех чисел в списке с другими числами в другом списке. (В том же порядке)

#python #sum #multiplication #dot-product

#python #сумма #умножение #точечное произведение

Вопрос:

Я хочу суммировать умножение списка на 2 соответственно (a[0] с b [0] до a [n] с b [n]) Примечание: я использую n, потому что список a и b является свободным вводом, поэтому их может быть много.

Если введенные данные являются :

 A = [ 12 , 0 , 3 , 7 , 2]
B = [ 1 , 2 , 5 , 4]
  

Я хочу сумму A * B (12*1 0*2 3*5 7*4 2*0 ( поскольку в B больше нет ))

Ответ №1:

Используйте itertools.zip_longest с fillvalue аргументом:

 sum(x*y for x, y in zip_longest(A, B, fillvalue=0))
  

Код:

 from itertools import zip_longest

A = [12, 0, 3, 7, 2]
B = [1, 2, 5, 4]

print(sum(x*y for x, y in zip_longest(A, B, fillvalue=0)))
# 55
  

Поскольку fillvalue равно 0 и это не приводит к каким-либо изменениям в операции (2 * 0 = 0), вы также можете просто использовать zip :

 sum(x*y for x, y in zip(A, B))
  


Функциональный подход довольно питонический (при условии, что fillvalue значение по-прежнему равно 0):

 from operator import mul

A = [12, 0, 3, 7, 2]
B = [1, 2, 5, 4]

print(sum(map(mul, A, B)))
# 55
  

Ответ №2:

Если всегда случается, что len(A) >= len(B)

 >>> sum([A[i]*B[i] for i in range(len(B))])
55

  

еще измените это на

 sum([A[i]*B[i] for i in range(min([len(A), len(B)]))])
  

Обновить

Я только что заметил, что zip это хорошо и с разной длиной списка, поэтому я думаю, что лучше всего было бы:

 >>> sum([a*b for a, b in zip(A, B)])
55