我需要编写应该输出列表L和K的点积的函数dot(L,K)。如果这两个输入列表的长度不相等,则dot应该输出0.如果这两个列表都是为空,dot也应输出0.您应该假设输入列表仅包含数值。
这是我到目前为止所做的:
21
有人可以帮助我,因为我无法弄清楚在最后一行做什么!
答案 0 :(得分:14)
您可以使用列表解析来执行此操作:
def dot(K, L):
if len(K) != len(L):
return 0
return sum(i[0] * i[1] for i in zip(K, L))
如果其中一个列表为空,zip(K, L)
将返回[]
。然后,根据定义,sum([])
将给你零。
答案 1 :(得分:4)
使用列表理解,给定V1和V2是两个向量(列表):
sum([x*y for x,y in zip(V1,V2)])
答案 2 :(得分:1)
for循环返回一个每个K * L元素相乘的数组。
然后sum函数添加每个元素并返回点积
def dot(K,L):
if len(K)==len(L) and len(K)!=0:
return sum([K[n]*L[n] for n in range(len(K))])
else:
return 0
答案 3 :(得分:0)
一个适用于自愿大小矢量的衬垫(您可能希望将其定义为更常规和可读的功能,或者将代码更改为使用sum
而不是最左侧reduce
)。它没有为不等长度定义乘法,因为它不是标准点积定义的一部分 - 它只会报告不等长度的错误:
dotprod =lambda K, L:reduce(lambda z1, z2: z1+z2, map(lambda x: reduce(lambda x1, x2: x1*x2, x), zip(K, L)))
快速测试:
dotprod([1, 2, 3, 4], [5, 6, 7, 8])
Out[39]: 70
5+12+21+32
Out[40]: 70
如果您仍希望合并非等式乘法的长度检查和定义:
dotprod =lambda K, L: reduce(lambda z1, z2: z1+z2, map(lambda x: reduce(lambda x1, x2: x1*x2, x), zip(K, L))) if len(K)==len(L) else 0
dotprod([1, 2, 3, 4], [5, 6, 7, 8])
Out[43]: 70
dotprod([1, 2, 3, 4], [5, 6, 7])
Out[44]: 0
答案 4 :(得分:0)
vector_a = [1., 2., 3.]
vector_b = [2., 2., 2.]
z=list(zip(vector_a,vector_b))
a=sum([x*y for x,y in zip(vector_a,vector_b)])
for m,n in z:
print(str(m)+"*",str(n))
print(a)
#hope you got it `
使用Zip函数可降低复杂度,从而在点积或任何多列表操作的情况下使用效率更高。