Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

【Pythonお悩み解決】forが複数あるリスト内包表記の理解の仕方

こんにちは、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行で書けたり、処理速度が速くなるなどのメリットがあります。
はじめのうちは理解するのが難しいですが、ぜひ使えるようになりましょう。

関連記事

リスト内包表記については、他の記事でも解説しています。

blog.pyq.jp

Copyright ©2017- BeProud Inc. All rights reserved.