Python 中两个列表的点积

Dot product of two lists in Python

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

这是我目前拥有的:

def dot( L, K ):
    if len[L]!=len[K]:
        return 0
    elif L == '' or L == []:
        return 0
    else:
        return sum(L[0]*K[0], L[1]*K[1], ect.)

谁能帮帮我,因为我不知道最后一行要做什么!

您可以使用列表理解来做到这一点:

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) 将 return []。然后,根据定义,sum([]) 将为您提供零。

for 循环 returns 每个 K*L 元素相乘的数组。 然后 sum 函数添加每个元素和 returns 点积

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

一个适用于任意大小向量的衬里(您可能希望将其定义为更规则和可读的函数或更改代码以使用 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

使用列表理解,给定 V1 和 V2 是两个向量(列表):

 sum([x*y for x,y in zip(V1,V2)])
    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 函数可以降低复杂性,使其在点积或任何多列表操作的情况下使用起来更加高效。