静かなる名辞

pythonとプログラミングのこと


【python】複数のlist(など)を対象にmapを使う

 あまり知られていませんが、組み込みのmapは実は複数のiterableを引数に取れるように定義されています。

追加の iterable 引数が渡されたなら、 function はその数だけの引数を取らなければならず、全てのイテラブルから並行して取られた要素に適用されます。複数のイテラブルが与えられたら、このイテレータはその中の最短のイテラブルが尽きた時点で止まります。

2. 組み込み関数 — Python 3.6.9 ドキュメント

 この機能を用いることで、複数の引数がある関数を対象にしてmapを使うことができます。

 簡単な例を見てみます。

>>> list(map(lambda x,y: x+y, [1,2,3], [4,5,6]))
[5, 7, 9]

 numpyが使えないor使うまでもないときに、ちょっとした配列操作をやるのに良いかもしれません。あとは文字列の結合とかにもいいかもしれません。要するに、同じ長さのリストなどを処理したいというときは使えます。

 なお、ドキュメントにもある通り、zipなどと同じく結果の長さは最短の引数に合わせられます。

>>> list(map(lambda x,y: x+y, [1,2,3], [4,5]))
[5, 7]

 また、itertools.startmapで同じことをやるとすると、こうなります。

>>> from itertools import starmap
>>> list(starmap(lambda x,y: x+y, zip([1,2,3], [4,5,6])))
[5, 7, 9]

【python】mapで複数の引数を渡したいときはstarmapが便利 - 静かなる名辞

 単に複数の引数を取る関数を使いたければ、starmapよりmapの第三引数以降を使った方が簡単です。