map関数 リストの全て要素に対して同じ処理を行う

map関数とは

map関数はリストなどのイテラブルオブジェクトな変数に対し、その全ての要素に指定した関数を実行し、結果を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に、実用上よく使用する例を書きました。参考にしてください。