PR

図解!Python内包表記(comprehensions)の使い方と具体例:リスト、if文、辞書の内包表記作成を学ぼう

python
記事内に広告が含まれています / This article contains ads

内包表記 (comprehensions) とは

Pythonの学習が進んでくると、for文などのループを使った繰り返しでデータを作成したり、読み込んだりすることを学習します。そして、さらにワンランク上のプログラミングテクニックとして、内包表記に遭遇したのではないでしょうか?

自分も初めて内包表記を目にしたときは、全く理解ができず、プロのプログラマーにしかできないテクニックだと思っていましたが、繰り返し使っていると徐々に慣れてくるものです。Pythonの内包表記(Comprehensions)は小難しいpythonテクニックではなく、リスト、セット、辞書などのデータ構造を簡潔に作成するための便利な方法です。

内包表記を一言で表すなら、

「ループを使わずにシンプルで読みやすいコードを書く」

です。そこで今回は、リスト内包表記、セット内包表記、辞書内包表記の具体的な例を挙げて説明しますので、肩の力を抜いて実際に手を動かして慣れていきましょう!

リスト内包表記:

まずは簡単な内包表記を体験してみましょう!

リスト内包表記は、ループを使って新しいリストを作成する方法です。例えば、1から5までの数を10倍したリストを作成するならば、

# リスト内包表記を使用した方法
nums_comp = [num*10 for num in range(1, 6)]
      
print(nums_comp)  

となり、出力には以下のようなリストが表示されます。

[10, 20, 30, 40, 50]

上の内包表記のコードを通常のfor文で書くと、

# 通常の方法
nums = []
for num in range(1, 6):
    num = num * 10
    nums.append(num)

print(nums)

となり、同様に、[10, 20, 30, 40, 50]が出力されます。

上下のコードを比較してみると内包表記はコードが短く(例の場合なら1行のみ)シンプルな表現になっていることがわかると思います。一方で、シンプルだけにプログラミング初心者には理解困難ですとなっている訳ですが…。

内包表記の基本形

コード内で内包表記を目にすると何が何だか解りにくいので、基本形を覚えましょう。

処理文 for 変数 in シーケンス

です。

コードの進み方は、for文から右側へ進み、最後に処理文となります。

上の例でいえば、num*10 for num in range(1, 6) が内包表記の部分ですね!
このコードではfor文が1つなので、
まず、for num in range(1, 6) から進み、1~5をnumに順番に代入する
そして、代入されたnumに対して、num*10 の処理がされるということになります。

さらに通常の方法(for文)から内包表記へと置き換えていく過程をイメージしやすいように図で示してみます。

こう見れば、for文以降に書かれた処理分が、内包表記では前に書かれている位置関係が理解しやすいですね。そしてリスト([ ])内に内包表記が書かれているので、nums.append(num)は省略されています。

if文で内包表記

次にif文で内包表記を使う場合を解説します。if文を使うことで「特定の条件を満たすデータだけを指定してリストに格納する」という処理が実現できます。

注意するのは、if文を使う場合はfor文の後ろにif文を記述する形をとります。

下の例文は先の例文にif文を追加したコードです。if文に「偶数=2で割ると割り切れる」という表見をつけることで、1~5の中から偶数のみを選択→numに代入→num*10と進んでいきます。

# リスト内包表記を使用した方法
even_comp = [num*10 for num in range(1, 6) if num % 2 == 0]
      
print(even_comp)  

結果、コードの出力は、

[20, 40]

となります。if文を含んだこの内包表記を通常の方法で表現すると以下のようになります。

# 通常の方法
even_nums = []
for num in range(1, 6):
  if num % 2 == 0:
    num = num * 10
    even_nums.append(num)

print(even_nums)

前回と同様に図で表してみます。前回よりは少し複雑になってきていますが、時間をかけて理解していきましょう。

辞書で内包表記を使う

内包表記は、辞書でも使うことができます。この場合、キー(key)と値(value)のペアを含む新しい辞書を作成する方法です。

例えば、1から5までの数字の2乗をキーとし、その数字を値とする辞書を作成します。

# 内包表記を使用した辞書
squared_dict_comp = {num**2: num for num in range(1, 6)}

上記のコードの出力は、

{1: 1, 4: 2, 9: 3, 16: 4, 25: 5}

です。辞書型を使った内包表記では、

変数名(辞書型)= {キー: 値 for文}

となります。

このコードを通常の方法で書くと、

# 通常の方法
squared_dict = {}
for num in range(1, 6):
    squared_dict[num**2] = num

のようになり、出力は同じになります。

復習になるかもしれませんが、すでに存在する辞書に新しい値を追加する場合は、 

辞書名[キー] =値

と記述すれば、値が上書きされます。

つまり、通常の方法では、squared_dict = { }という空の辞書を作成し、for文で1~5をnumに代入→squared_dict[num**2] = numと、キーと値を繰り返しています。

まとめ

Pythonの内包表記は、簡潔で効率的なコードを書くための便利な方法です。この記事では、リスト、if文、辞書での内包表記の使い方と具体的な例を解説しました。リストでの内包表記を使えば、ループを回さずに新しいリストを生成することができます。if文を含むと少し複雑になりますが、条件設定も可能ですね。また、辞書での内包表記を使えば、キーと値のペアを持つ辞書を効率的に生成できます。

これらの内包表記は、Pythonのコードをより読みやすく、メンテナンス性の高いものにするために活用できます。プログラミング初心者から上級者まで、ぜひ内包表記の使い方を学んでPythonコーディングのスキルを向上させましょう!

コメント