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) # [2, 6, 12, 100, 10] # for文を使って同じことをする場合 data2 = [] for val in data1: data2.append(calc_double(val))
いかがでしょうか?新たにリストを作成し、ループで回してappendして・・・という手間が省けます。
ただし1点注意があります。map関数の戻り値はlistではなく、シーケンスのmapオブジェクトなのでインデックスでアクセスしたり、ループで回したりできますが、append等のlistのメソッドは使用できません。また、print関数で出力しても、カンマ区切りの要素では表示されず、オブジェクトの型名が表示されるだけです。
# map関数の戻り値はlistではない # 数値を倍にする関数 def calc_double(n): return n * 2 data1 = [1, 3, 6, 50, 5] # data1の要素を全て倍にしてdata2に格納する data2 = map(calc_double, data1) # [2, 6, 12, 100, 10] print(data2) # 中身が表示されない <map object at 0x7f3dc1c84048> data2.append(2) # 以下のエラーが発生する # Traceback (most recent call last): # File "sample_map.py", line 10, in <module> # data2.append(2) # AttributeError: 'map' object has no attribute 'append'
ですが、map関数の戻り値はシーケンスなので、以下のようにlist関数を使用してlist型に変換することができます。
# 数値を倍にする関数 def calc_double(n): return n * 2 data1 = [1, 3, 6, 50, 5] # data1の要素を全て倍にしてdata2に格納する data2 = list(map(calc_double, data1)) # list型に変換する print(data2) # [2, 6, 12, 100, 10] data2.append(2) print(data2) # [2, 6, 12, 100, 10, 2]
補足 lambda式と組み合わせる
さて、この手で使用する短い関数は一般的にlambda式を使用することが多いです。lambda式を使用したものに書き直すと以下のようになります。
data1 = [1, 3, 6, 50, 5] data2 = map(lambda x: x * 2, data1)
補足2 実用例
「リストをカンマ区切りの文字列に変換する」というTIPSに、実用上よく使用する例を書きました。参考にしてください。