我试图使用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)
答案 0 :(得分:6)
>>> 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.mul
和map
中使用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;原始列表a
和b
的相应元素的产品。
下一步是迭代列表以对元素求和:
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)