web-dev-qa-db-ja.com

Pythonの2つのリストの内積

リストLとKの内積を出力する関数dot(L、K)を記述する必要があります。これら2つの入力リストの長さが等しくない場合、dotは0を出力する必要があります。これら2つのリストが両方とも空の場合、dotまた、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.)

最後の行で何をすべきかわからないので、誰かが私を助けてくれますか?

3
Benjamin Brooks

リスト内包表記を使用してこれを行うことができます。

_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([])はゼロを返します。

13
VHarisop

リスト内包表記を使用すると、V1とV2は2つのベクトル(リスト)になります。

 sum([x*y for x,y in Zip(V1,V2)])
4
abhikarma1493

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
1

自発的なサイズのベクトルに対して機能する1つのライナー(より規則的で読みやすい関数として定義するか、左端の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
0
VDV