map関数とは
map関数はリストなどのイテラブルオブジェクトな変数に対し、その全ての要素に指定した関数を実行し、結果をmap型と呼ばれるオブジェクトで返却します。以下の引数を指定します。おそらくこれだけだと何のことかわからないと思いますので、具体的な例を交えて学習してみましょう。
リストの全ての要素を倍にする
具体例として、リストの全ての要素を倍にする場合について考えてみましょう。ある数値を倍にして返す関数は以下のように定義できます。
# 数値を倍にする関数 def calc_double(n): return n * 2 x = 3 y = calc_double(x) # 3 * 2で6が格納される
さて、あるリストの全ての要素対してcalc_doubleを実行し、結果を新たなリストとして取得する場合、map関数を使用すると以下のように記述することができます。同じ処理をfor文を使った場合と比較してみてください。
# 数値を倍にする関数 def calc_double(n): return n * 2 data1 = [1, 3, 6, 50, 5] # map関数を使用してdata1の要素を全て倍にしてdata2に格納する場合 data2 = map(calc_double, data1) print(list(data2)) # mapをlistに変換して表示 [2, 6, 12, 100, 10]
いかがでしょうか?新たにリストを作成し、ループで回してappendして・・・という手間が省けます。forを使用すると以下のようになります。
# 数値を倍にする関数 def calc_double(n): return n * 2 data1 = [1, 3, 6, 50, 5] # for文を使って同じことをする場合 data2 = [] for val in data1: data2.append(calc_double(val))
ただし1点注意があります。map関数の戻り値はリストではなくイテラブルなmapオブジェクトと呼ばれるものです。ループ処理は可能なのですが、append等のリストのメソッドは使用できません。また、print関数で出力しても、カンマ区切りの要素では表示されず、オブジェクトの型名が表示されるだけです。ですので、リストにしたい場合はlist関数で変換する必要があります。
2021/10 「mapオブジェクトはシーケンス」という記述がありましたが誤りであるため訂正しました。
補足 lambda式と組み合わせる
この手で使用する短い関数をオブジェクトとして扱う場合、一般的にlambda式を使用することが多いです。lambda式を使用したものに書き直すと以下のようになります。
data1 = [1, 3, 6, 50, 5] data2 = map(lambda x: x * 2, data1)
補足2 実用例
「リストをカンマ区切りの文字列に変換する」というTIPSに、実用上よく使用する例を書きました。参考にしてください。