11

mapこの機能を使用しsumて達成することはできますが、どのように使用するのreduceですか?

2 つのリストがあります: ab、同じ数の値があります。計算したい

a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n]

私が使用して書いた作業バージョンmap

value =  sum(map(lambda (x,y): x*y, zip(a, b)))

じゃあどうやって使うのreduce?私が書いた:

value =  reduce(lambda (x,y): x[0]*y[0] + x[1]*y[1], zip(a, b)))

エラー " TypeError: 'float' object is unsubscriptable" が発生しました。

誰でもこれに光を当てることができますか?

4

6 に答える 6

8

reduceとを使用したソリューションmap

from operator import add,mul

a = [1,2,3]
b = [4,5,6]

print reduce(add,map(mul,a,b))
于 2011-04-07T14:12:29.157 に答える
8

ラムダ関数の最初の引数はこれまでの合計で、2 番目の引数は要素の次のペアです。

value = reduce(lambda sum, (x, y): sum + x*y, zip(a, b), 0)
于 2011-04-07T14:04:28.520 に答える
7

私はこのようにします(ラムダは必要ないと思います)...

sum(x*y for x, y in zip(a, b))

これはまた、もう少し明確に見えます。AB を圧縮し、それらを乗算し、項を合計します。

于 2011-04-07T14:05:05.727 に答える
1

reduce の問題は、マップが正しくない場合に発生します。

式を見てみましょう: value = sum(map(lambda (x,y): x*y, zip(a, b)))

マップは変身。タプルを単純なフラット値に変換するために必要です。あなたの場合、次のようになります。

map(lambda x: x[0]*x[1], zip(a,b))

そして、sum経由reduceで表現したい場合は、次のようになります。

reduce(lambda x,y: x + y, map)

だから、ここにがあります:

a = [1,2,3]
b = [4,5,6] 
l = zip(a,b)
m = map(lambda x: x[0]*x[1], l)
r = reduce(lambda x,y: x + y, m)
于 2015-07-02T12:35:30.503 に答える