こんにちは、PyQサポートです。
今回は、Pythonのリスト内包表記のうち、forが複数ある場合について解説します。
質問:forが複数あるリスト内包表記はどのように理解すればよいですか?
以下のようなコードがあります。このコードの
result = [num for row in data for num in row]
の部分のように、forが複数あるリスト内包表記はどのように理解すればよいですか?
data = [[1, 2], [3, 4]] result = [num * 2 for row in data for num in row] # [2, 4, 6, 8]
回答:まずはfor文に直してみます
リスト内包表記を構成する必須な要素は「式」「for節」の2つです。
a = [n * 3 for n in [1, 2, 3, 4]] # [3, 6, 9, 12]
n * 3
が式で、for n in [1, 2, 3, 4]
がfor節です。
リスト内包表記では、さらに任意の要素として「if節」「for節」を追加できます。
わかりやすくするために、まずif節の場合について見てみます。
result = [n * 3 for n in [1, 2, 3, 4] if n > 2] # [9, 12]
これをfor文とif文に直してみると、以下のようになります。
result = [] for n in [1, 2, 3, 4]: if n > 2: result.append(n * 3) # [9, 12]
for文に直したことで、「for節のなかに、if節が入っている」という関係が把握しやすくなったと思います。
では、質問のようにfor節が複数ある場合について見てみます。
これは、上のコードでif節だった部分に、for節が使われています。
result = [num for row in data for num in row]
という表記をいったんfor文に直してみます。
data = [[1, 2], [3, 4]] result = [] for row in data: for num in row: result.append(num * 2) # [2, 4, 6, 8]
こちらもfor文に直したことで、「前のfor節のなかに、後ろのfor節が入っている」という関係が把握しやすくなったと思います。
まとめ
今回のポイントはこちらです。
- リスト内包表記は必須の「式」「for節」と任意の「if節」「for節」で構成されている
- 難しいリスト内包表記はfor文に直して考えてみる
リスト内包表記に慣れると、複数行にわたるコードを簡潔に1行で書けたり、処理速度が速くなるなどのメリットがあります。
はじめのうちは理解するのが難しいですが、ぜひ使えるようになりましょう。
関連記事
リスト内包表記については、他の記事でも解説しています。