[Python]繰り返し処理(内包処理の基本的な使い方)

本記事では、Pythonの繰り返し処理の内包表記を紹介します。

こんな人におすすめ

  • 内包表現とは何か知りたい
  • 繰り返し処理で条件分岐を組み合わせたい
  • 内包表現で取り出した要素に関数を適用したい

主なライブラリ

なし。

本ページで使用するライブラリをインポートするときは以下のコードを使用します。

import time
import matplotlib.pyplot as plt
import numpy as np

内包表現とは

内包表現とは、for文を使った繰り返し処理を1行で記載する方法となります。

# 内包表現で配列を使った繰り返し処理
print([i for i in list1])
# [1, 2, 3]

# 内包表現でrangeを使った繰り返し処理
print([i for i in range(3)])
# [0, 1, 2]

内包表現のメリット、デメリット

内包表現を使うことで、処理速度が上がるメリットがあります。
一方で、内包表現を使うことで可読性が下がる(読みづらくなる)デメリットがあります。

条件付き内包表現(if)

内包表現で記載した繰り返し処理は、条件分岐を適用することも可能です。
以下の内包表現のコードでは、「if i % 2 == 0」で偶数の数字だけ取り出す用フィルタリングをしています。

# 偶数のものだけ取り出す
print([i for i in range(3) if i % 2 == 0])
# [0, 2]

条件付き内包表現(if else)

また、内包表現では、以下のようにコードを記載することで、if else形式で条件分岐させることも可能です。

# 偶数のときはそのまま、奇数の時はaを返す
print([i if i % 2 == 0 else 'a' for i in range(5)])
# ⇒ [0, 'a', 2, 'a', 4]

条件付き内包表現(複数条件)

内包表現の条件分岐は複数の条件を設定することができます。
複数条件を設定する場合は、通常の条件分岐と同様、AND条件とOR条件を設定します。

# AND条件
print([i if i % 2 == 0 and i >= 3 else 'a' for i in range(5)])
# ['a', 'a', 'a', 'a', 4]

# OR条件
print([i if i < 1 or i >= 3 else 'a' for i in range(5)])
# [0, 'a', 'a', 3, 4]

内包表現で取り出した要素に関数を適用する

以下のようにコードを記載することで、取り出した要素に、関数を適用するなどの処理を行うことができます。

# 取り出した要素を倍にする
print([i * 2 for i in range(5)])
# [0, 2, 4, 6, 8]

# 取り出した要素を四捨五入する
print([round(i, 1) for i in [1.23, 2.34, 3.45]])
# [1.2, 2.3, 3.5]

内包表現の処理速度

内包表現のメリットとして、通常処理と比べて処理速度が速いことを紹介しました。
以下のような処理を作成し、実際に処理速度を計測しました。

# 通常の繰り返し処理
list1 = []
for i in range(100000):
    list1.append(i)

# 内包表現の繰り返し処理
list1 = [i for i in range(100000)]

処理速度の平均値を計測した結果は以下の通りとなります。
通常の繰り返し処理  :0.010(s)
内包表現の繰り返し処理:0.005(s)
通常の処理と比べて、内包表現の処理の方が早いという結果となりました。