Symfoware

Symfowareについての考察blog

Python map関数で引数を2つ取るlambdaを指定

やりたかったこと



長さが同じ配列が2つある。

ary1 = v1-1, v1-2, v1-3
ary2 = v2-1, v2-2, v2-3



同じインデックスの値を掛けあわせた合計が欲しい。
※要は行列の乗算がしたかった

total = (v1-1 * v2-1) + (v1-2 * v2-2) + (v1-3 * v2-3)




例えば

ary1 = [1, 2, 3]
ary2 = [5, 6, 7]



の場合は


total = (1 * 5) + (2 * 6) + (3 * 7)
= 38







素直な実装



何も考えずに実装するとこうなりました。


  1. # -*- coding:utf-8 -*-
  2. ary1 = [1, 2, 3]
  3. ary2 = [5, 6, 7]
  4. total = 0
  5. for i, val1 in enumerate(ary1):
  6.     total += val1 * ary2[i]
  7. print(total)





zip



もうちょっと頭を使って、zip関数で2つの配列を同時にイテレートしてやります。


  1. # -*- coding:utf-8 -*-
  2. ary1 = [1, 2, 3]
  3. ary2 = [5, 6, 7]
  4. total = 0
  5. for val1, val2 in zip(ary1, ary2):
  6.     total += val1 * val2
  7. print(total)




だいぶすっきりしました。




map



map関数で綺麗にまとまらないか。
まず、各々の配列を掛けあわせた配列を作ることを考えました。


  1. # -*- coding:utf-8 -*-
  2. ary1 = [1, 2, 3]
  3. ary2 = [5, 6, 7]
  4. ret = map(lambda val1, val2: val1 * val2, zip(ary1, ary2))
  5. print(ret)




Python3で実行するとmapオブジェクトがそのまま表示されます。
mapはシーケンスを返すようになったそうです。


$ python3 test.py
<map object at 0x7f849e535b38>




list関数で配列に直して表示。


  1. # -*- coding:utf-8 -*-
  2. ary1 = [1, 2, 3]
  3. ary2 = [5, 6, 7]
  4. ret = map(lambda val1, val2: val1 * val2, zip(ary1, ary2))
  5. print(list(ret))




これはエラーになります。


$ python3 test.py
Traceback (most recent call last):
File "test.py", line 7, in <module>
    print(list(ret))
TypeError: <lambda>() missing 1 required positional argument: 'val2'




どうしたものか。





mapにはlistを複数指定できる



Pythonでmap関数は引数listを複数指定できる。

なんと。
上記のような思考を通ってmapしようとしていたので、zipが頭から離れなかった。
zipせずにmapに2つの配列を渡してやります。


  1. # -*- coding:utf-8 -*-
  2. ary1 = [1, 2, 3]
  3. ary2 = [5, 6, 7]
  4. ret = map(lambda val1, val2: val1 * val2, ary1, ary2)
  5. print(list(ret))




狙った計算結果が取得できました。


$ python3 test.py
[5, 12, 21]







sum



後はmapした結果をsumして合計を得れば良いことになります。


  1. # -*- coding:utf-8 -*-
  2. ary1 = [1, 2, 3]
  3. ary2 = [5, 6, 7]
  4. ret = sum(map(lambda val1, val2: val1 * val2, ary1, ary2))
  5. print(ret)




すっきりしました。


$ python3 test.py
38





関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/11/01(水) 23:17:42|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu Server 16.04に固定IPを設定 | ホーム | Ubuntu 16.04にOpenJDK 9をインストール>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/2061-3db2d856
この記事にトラックバックする(FC2ブログユーザー)