intellista

engineer's notes about application development, data analysis, and so on

Pythonの内包表記やmap関数で、低速で冗長なfor文から解放されよう!


こんにちは!
今回はPythonの内包表記やmap関数についてお話したいです。

Python内包表記map関数を使っていますか?
もし使っていなかったら、本当にもったいないことです。
自分も周囲も本当にラクになるので、ぜひ使い倒しましょう!

今回は例を挙げてPython内包表記map関数の良さをご紹介します!

内包表記やmap関数の良さ

内包表記map関数の良さについてご説明します。

例えば、次のような要件があるとします。

  • ['a', 'b', 'c'] というリストを "A","B","C" という文字列に変換したい

このとき、Pythonの言語仕様をおさえていれば、次のようにシンプルに書けます。

    columns = ['a', 'b', 'c']
    columns = ['"' + str(x).upper() + '"' for x in columns]
    columns = ','.join(columns)
    print(columns)
    columns = ['a', 'b', 'c']
    columns = map(lambda x:'"' + str(x).upper() + '"', columns)
    columns = ','.join(columns)
    print(columns)

ポイントは、次のとおりです。

  • 内包表記columns = ['"' + str(x).upper() + '"' for x in columns]
    または
    map関数とラムダ式の組み合わせcolumns = map(lambda x:'"' + str(x).upper() + '"', columns)
    により["A","B","C"]に変換
  • ["A","B","C"]を文字列型の組み込み関数joinで文字列"A","B","C"に変換

めちゃめちゃシンプルかつ明快ですね!

一方、もっとも初歩的なアプローチは、for文を使うことです。
例えば、次のようになります。

    columns = ['a', 'b', 'c']

    items = []
    for column in columns:
        column = '"' + str(column).upper() + '"'
        items.append(column)

    string = ''
    for index, item in enumerate(items):
        if index == 0:
          string += str(item)
        else:
          string += ',' + str(item)

    columns = string
    print(columns)

努力はわかりますが、長いですね・・・

力技で書くとこうなってしまいますが、開発現場でこういったコードが積み重なると可読性やメンテナンス性に支障をきたし、読み解けないレベルになってしまうと最悪「つくりなおし」ということにもなりかねません。

for文の力技は基本、避けたいものです。
(技術者としての信用も失いかねません。ただし、開発規模で生産性など評価してくる昔ながらの人たちへの対策にはちょうどいいのかもしれません・・・)

内包表記とmap関数の注意点

ただし、内包表記とmap関数で1つ、おさえておきたい注意点があります。
それは、どちらも全ての要素をループするという点です。
そのため、もし性能の観点などから途中でループを抜ける(breakする)必要がある場合は、for文で書く必要があります。

内包表記について

内包表記は、私がPythonで最も感動した言語仕様の一つですが、最初はとっつきにくいものでした。
しかし、「Python 3 エンジニア認定基礎試験」の公式テキストである「Pythonチュートリアル(日本語版)」の章「付録E.2 内包がわからぬ」を通読したとたんに完全に理解でき、使い倒せるようになりました。
(「付録E.2 内包がわからぬ」は、無料のWeb版には含まれない書籍の独自のコンテンツです。)
この場を借りて、著者の鴨澤様に深く感謝いたします。

Pythonチュートリアル 第3版

2021年9月19日追記:
新しい版の「Pythonチュートリアル 第4版」が発売されていたので、リンクを貼ります。上述でご紹介した章「付録E.2 内包がわからぬ」も健在です。
Pythonチュートリアル 第4版

map関数について

map関数Google検索して入手した知識ですが、内包表記と比べればとても直感的で簡単です。

ラムダ式は前述の「Pythonチュートリアル」にも説明がありますが、今では採用している言語も多いので特筆すべきポイントでもなさそうです。
(もしアプリケーション開発などの仕事でラムダ式に不安がある場合は、習得は急務です。)

なお、本記事ではmap関数のみ取り上げましたが、同様にすべての要素に処理する関数としては、filter関数reduce関数があります。
これらは処理を簡潔かつ明快に書けますので、私は重宝しています。

まとめ

今回はPython内包表記map関数の良さをご紹介しました。
Pythonによる開発の可読性やメンテナンス性の向上に役立てたら嬉しいです!

なお、内包表記やmap関数も非常に重要ですが、それ以外でもPythonにはコツが必要なシーンが多々あります。
Python、Pandas、データ分析、に関するコツなどを次の記事にまとめてありますので、是非読んでみてください!
intellista.hatenablog.com

また、今回のトピックに限らないことですが、「もっとシンプルな書き方はないか?」「こんなよくありそうな力業、同じことを実現できる関数やライブラリがあるはずでは?」といった疑問を持つことは、技術者として持っておきたい気づきの1つだと思います。
プログラミングに関しては、検索すればいくらでも情報が出てくるので、今後も活用したいものです!