Python中两个列表的点积

时间:2015-09-19 15:16:45

标签: python list product numeric

我需要编写应该输出列表L和K的点积的函数dot(L,K)。如果这两个输入列表的长度不相等,则dot应该输出0.如果这两个列表都是为空,dot也应输出0.您应该假设输入列表仅包含数值。

这是我到目前为止所做的:

21

有人可以帮助我,因为我无法弄清楚在最后一行做什么!

5 个答案:

答案 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函数可降低复杂度,从而在点积或任何多列表操作的情况下使用效率更高。