如何在python中使用for循环对两个列表项的乘积求和?

时间:2017-01-24 06:06:52

标签: python

我试图使用for循环对同一行中两个不同列表项的乘积求和,但我没有按预期得到输出。

我的示例代码:

a = [1,2,3]
b = [4,5,6]

sum = 0              # optional element

score = ((sum+(a(i)*b(i)) for i in range(len(a)))

print score

输出:

<generator object <genexpr> at 0x027284B8>

预期产出:

32                   # 0+(1*4)+(2*5)+(3*6)

7 个答案:

答案 0 :(得分:6)

只需zip生成配对的列表,将它们相乘并输入sum

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> sum(x * y for x, y in zip(a, b))
32

在上面zip将返回包含两个列表中一个数字的元组的可迭代:

>>> list(zip(a, b))
[(1, 4), (2, 5), (3, 6)]

然后使用生成器表达式将数字相乘:

>>> list(x*y for x, y in list(zip(a, b)))
[4, 10, 18]

最后sum用于将它们加在一起以得出最终结果:

>>> sum(x*y for x, y in list(zip(a, b)))
32

答案 1 :(得分:3)

您的代码中存在一些问题,首先您无法使用您需要的括号[]索引列表,其次您创建的是生成器而不是数字。

您需要先zip您的列表:

In [3]: sum(i*j for i,j in zip(a, b))
Out[3]: 32

或者作为一种功能方法,在operator.mulmap中使用sum

In [11]: from operator import mul 

In [12]: sum(map(mul, a, b))
Out[12]: 32

答案 2 :(得分:3)

生成器本身,即使应用于生成列表结果,也只会为您提供产品列表。您仍然需要做一些事情来添加列表中的元素,这些元素在您的生成器中无法完成。

您的方法看起来像是将传感器语法与传统的for循环混合在一起,如下所示:

score = 0
for i in range(len(a)):
  score = score + a[i]*b[i]

最干净,或者至少是大多数Pythonic解决方案可能使用zip来组合列表,使用列表理解来增加元素,并sum将它们全部添加:

score = sum([x*y for (x,y) in zip(a,b)])

您还可以使用reduce作为全功能方法(请注意,如果您使用Python 3,则必须import functools

score = reduce(lambda s,t: s+t[0]*t[1], zip(a,b), 0)

答案 3 :(得分:2)

让我们仔细看看您的代码:

score = ((sum+(a(i)*b(i)) for i in range(len(a)))

此语句的右侧是生成器表达式。将生成器视为惰性列表。它实际上并没有总结任何东西,所以为了更加正确你应该做

score = (a[i]*b[i] for i in range(len(a)))

(注意括号,而不是括号,用于下标列表。)

现在score是一个&#34;包含&#34;原始列表ab的相应元素的产品。

下一步是迭代列表以对元素求和:

for x in score:
    sum += x
print(sum)

正如其他人已发布的那样,您可以使用zip()sum()内置函数在一行中执行此操作:

sum([x*y for x, y in zip(a, b)])

答案 4 :(得分:1)

a = [1,2,3]
b = [4,5,6]
ls = [x * y for x, y in zip(a, b)]
x = sum(ls) 
print x

答案 5 :(得分:0)

您可以尝试:

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> sum(map(lambda x: x[0] * x[1], zip(a, b)))
32

答案 6 :(得分:0)

如果列表很大,则可以考虑使用numpy数组获取点积

import numpy as np
arr1 = np.random.randint(0,2,300)
arr2 = np.random.randint(0,2500,300)

list1 = list(arr1)
list2 = list(arr2)

%timeit sum([x * y for x, y in zip(list1,list2)])

38.9 µs ± 795 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit arr1 @ arr2

1.23 µs ± 89.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)