#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