Pythonのmap関数の使い方を徹底解説初心者向け

公開日:2021.09.30

スキルアップ
 

Pythonには、他のプログラミング言語でも見られる「map関数」が実装されています。map関数を使うことで、プログラムの視認性が向上するため、読みやすいプログラムを記述するうえでも重要です。今回は、map関数の基本的な使い方や、for文・内包表記などとの比較といった、map関数の理解を深めるための情報を紹介していきますので、ぜひ最後までご覧ください。

Pythonのmap関数とは

Pythonのmap関数は、配列の全要素にアクセスして、関数を適応させることができます。For文を使っても同じことはできますが、繰り返し処理をしなくても全要素にアクセスできる点が、map関数最大のメリットです。ループが不要になるため、ソースコードもよりシンプルになります。基本の書式や引数については、以降で解説します。

基本の書式

map関数の書式は、Python3系とPython2系で少々異なります。

Python3系の場合、map関数の書式は、以下の通りです。


    list(map(関数,  イテラブル))

Python2系の場合、map関数の書式は、以下の通りです。


    map(関数,  イテラブル)

本記事では、Python3系の書き方に合わせてサンプルコードを記載しています。

map関数の引数

map関数の第1引数では、mapを適用したい関数を指定、第2引数では、イテラブルオブジェクトを指定します。イテラブルとは、listやrange関数のようなfor文のinの後に記載するオブジェクトです。第1引数で指定した関数に対し、第2引数で指定したイテラブルオブジェクトのすべての要素を適用させることができます。

また、イテラブルは以下のように複数指定することもできます。


    list(map(関数,  イテラブル1, イテラブル2))

複数のイテラブルを扱う場合、指定した関数側も、引数をイテラブルの数分(上記の場合なら引数2つ)用意することが必要です。

map関数の使い方

ここからは、Pythonのmap関数の基本的な使い方について、サンプルコードを交えながら説明します。

基本の使い方

サンプルコードとして、map関数の基本的な使い方を示します。


    # map関数に引き渡すイテラブル「sample1_list」の定義
    # range(5)の実行によりsample1_listの中には「0,1,2,3,4」の値が入っている
    sample1_list = list(range(5))

    # イテラブルを処理する関数「multi」の定義
    def multi(x):
        y = x*2
        return y

    # map関数を呼び出し、multi関数にイテラブルsample1_listを引き渡す
    sample2_list = map(multi, sample1_list)

    # multi関数からの戻り値sample2_listの値をプリントアウトして確認
    print(list(sample2_list))

上記のサンプルコードを実行すると、結果は以下の通りになります。


    [0, 2, 4, 6, 8]

複数のイテラブルオブジェクトを渡す場合のサンプルコードは、以下の通りです。


    sample1_list = [1, 2, 3]
    sample2_list = [4, 5, 6]

    # 2つの引数を取る関数を定義
    def myfunc(i, j):
        return (i, j)

    print(list(map(myfunc, sample1_list, sample2_list)))

上記を実行すると、sample1_listとsample2_listの要素を一つずつ持つ要素を含むリストが返されます。上記のサンプルコードの実行結果は、以下の通りです。


    [(1, 4), (2, 5), (3, 6)]

複数のイテラブルオブジェクトの長さが異なる場合は、最も短いイテラブルオブジェクトの長さに合わせた処理となるため、要注意です。


    # 長さの異なるイテラブルオブジェクトを定義
    sample1_list = [1, 2, 3]
    sample2_list = [4, 5, 6, 7, 8, 9]

    # 2つの引数を取る関数を定義
    def myfunc(i, j):
        return (i, j)

    print(list(map(myfunc, sample1_list, sample2_list)))

実行結果は、以下の通りです。長さの短いsample1_listに合わせて処理が終了していることがわかります。


    [(1, 4), (2, 5), (3, 6)]

リストの各要素をint型からstr型へ変換

リストの各要素がint型の場合に、str型へ変換するサンプルコードは、以下の通りです。


    #イテラブルオブジェクトaを作成
    sample = [1, 2, 3, 4, 5]
    #第一引数に指定する関数をstr関数にする
    print(list(map(str, sample)))

上記コードの実行結果は、以下の通りです。各要素が文字列に変換されていることがわかります。


    ['1', '2', '3', '4', '5']

任意関数の定義例

map関数に指定する関数は、任意定義の関数でも問題なく使えます。以下のサンプルコードは、任意の関数を定義してmap関数の第1引数に指定する例です。


    # 任意関数「myfunc」を定義
    def myfunc(n):
        return n**2

    # 第2引数として渡すイテラブルオブジェクトsampleを定義
    sample = [1, 2, 3, 4]

    # map関数呼び出し
    print(list(map(myfunc, sample)))

上記コードの実行結果は、以下の通りです。


    [1, 4, 9, 16]

sampleの各要素がmyfunc関数で処理されていることがわかります。

lambda式を使う場合

map関数の第1引数は、関数だけではなくlambda(ラムダ)式でも許されています。lambda式とは、ある処理に名前を付けずに定義したもののこと。lambda式を使うと、def文での関数定義も不要です。先述したmulti関数をlambda式に変換したサンプルコードは、以下の通りです。

【multi関数】


    def multi(x):
        y = x*2
        return y

【multi関数をlambda式に変換】


    lambda y: y*2

lambda式を使って基本の使い方のサンプルコードを書き換えると、以下のようになります。


    sample1_list = list(range(5))
    sample2_list = map(lambda y: y*2, sample1_list)
    print(list(sample2_list))

multi関数を定義しなくていい分、ソースコードはシンプルになりました。あまりに複雑な処理を行う関数の場合は、関数を定義したほうがソースの可読性は上がります。ただ、処理のシンプルな関数なら、lambda式を使うことも検討するといいでしょう。

map関数と他の表記との比較

ここからは、map関数とforループ・内包表記ではどのように表記が変わってくるのかを紹介します。基本の使い方で示した以下のサンプルコードを、他の表記に書き換えてみましょう。


    sample1_list = list(range(5))

    def multi(x):
        y = x*2
        return y

    sample2_list = map(multi, sample1_list)
    print(list(sample2_list))

forループとの比較

上記のサンプルコードをfor文に書き換えると、以下のようになります。


    sample1_list = [1, 2, 3, 4, 5]
    sample2_list = []

    for i in sample1_list:
        sample2_list.append(i**2)

    print(list(sample2_list))

ループ処理がある分、コードは少々複雑です。map関数が使えるなら、map関数で記載することでソースコードはより一層シンプルになります。

内包表記との比較

では、map関数での処理を内包表記に書き換えてみるとどうでしょうか。内包表記とは、リストや辞書などのイテラブルオブジェクトを使うループ処理をシンプルに記述できる記法です。以下は、内包表記でmap関数処理を書き換えたサンプルコードです。


    sample1_list = [1, 2, 3, 4, 5]

    # リスト内包表記
    sample2_list = [i**2 for i in sample1_list]

    # ジェネレータ式(要素を1つずつ返す場合)は (i**2 for i in sample1_list)と記載
    # セット内包表記(setを返す場合)は{i**2 for i in sample1_list}と記載

    print(list(sample2_list))

内包表記だと1行で処理をまとめられますが、ループ処理に関する記載は残るため、ソースとしては複雑な記載が残る形です。

Pythonのmap関数を使いこなしてソースの視認性を上げよう

Pythonのmap関数は、イテラブルオブジェクトの全要素を、指定した関数に適用させることのできる便利さが特徴です。イテラブルオブジェクトを複数渡す場合は、「長さの最も短いものに合わせて処理が終了する」という点は覚えておきましょう。

map関数は、繰り返し処理をシンプルに記載できるため、プログラムコードの可読性が上がり、誰にも読みやすいソースコードを作成できます。map関数を使いこなし、すっきりとしたソースコードの作成ができるようにしましょう。

AKKODiSはキャリアアップに向けたサポートにも力を入れています。

Pythonについて体系的に学びたい場合は、AKKODiS(派遣・紹介予定派遣)のキャリアアップサポートの一つ「AKKODiS Academy別ウィンドウで開く」のPython講座がおすすめ。勉強を進めて、実際の開発案件に挑戦したい場合は、AKKODiSの派遣エンジニア求人への応募もご検討ください。

AKKODiSでは、働く期間を調整しやすい有期雇用派遣や、派遣先の企業で社員として働くことを目指す紹介予定派遣、エンジニア正社員(無期雇用派遣)として派遣先の企業で働くなど、あなたのライフスタイルに合わせた働き方を可能にします。

(2021年9月現在)

AKKODiSコンサルティングに関するお問い合わせ