Python で 1 行にネストされた for ループ

  1. Python でリスト内包表記を使用して 1 行でネストされた for ループを書く方法
  2. Python で exec() 関数を使用して 1 行でネストされた for ループを書く方法
  3. 結論
Python で 1 行にネストされた for ループ

[for ループ]({{relref “/HowTo/Python/one line for loop python.ja.md”}})は、リストからアイテムを反復処理するために最も一般的に使用されるループの 1つです。Python では、for ループを 1 行で書くことができますが、その中に別のループを使用する必要がある場合、どのように 1 行で書くことができるでしょうか?

このチュートリアルでは、ネストされた for ループを 1 行で書くために使用できる方法について説明します。

Python でリスト内包表記を使用して 1 行でネストされた for ループを書く方法

ネストされた for ループを 1 行で書く 1つの方法は、リスト内包表記を利用することです。リスト内包表記は、Python でリストを作成するための簡潔で表現力のある方法であり、1 行のコードで新しいリストを作成することができます。

基本構文:

result = [
    expression
    for outer_loop_variable in outer_iterable
    for inner_loop_variable in inner_iterable
]

構文では、expression は新しいリストに含まれる値であり、内包表記は外側と内側の反復可能オブジェクトからの要素の組み合わせを反復処理します。フィルタリングのためにオプションの if ステートメントを含めることもできます。

リスト内包表記を使用した例を見てみましょう。まず、listOnelistTwo という 2つのリストを作成し、それらを使用して以下のように結果を出力します。

例コード 1:

listOne = [1, 3, 5]
listTwo = [2, 4, 6]

[print(a + b) for a in listOne for b in listTwo]

出力:

3
5
7
5
7
9
7
9
11

上記のコードでは、listOnelistTwo という 2つのリストがあり、それぞれ [1, 3, 5][2, 4, 6] の要素を持っています。リスト内包表記を使用して、これら 2つのリストからのすべての可能な要素の組み合わせを反復処理します。これはネストされた for ループによって表されます。

listOne からの'a'listTwo からの'b'で表される各要素のペアについて、式 (a + b) を使用してそれらの合計を計算し、print() ステートメントを使用して各組み合わせの合計を出力します。

条件付きで for ループをネストする別の例を見てみましょう。

例コード 2:

listOne = [1, 3, 5]
listTwo = [2, 4, 6]

result = [(a + b) for a in listOne for b in listTwo if a != b]
print(result)

出力:

[3, 5, 7, 5, 7, 9, 7, 9, 11]

上記のコードでは、listOnelistTwo という 2つのリストを初期化します。次に、リスト内包表記とネストされた for ループを使用して、2つのリストからのすべての可能な要素の組み合わせを反復処理します。

次に、条件 if a != b により、両方のリストからの要素が等しいペアを除外します。有効な各ペアについて、式 a + b を使用して合計を計算します。

結果のリストは result という名前で保存されます。最後に、result リストの内容を出力します。

出力 [3, 5, 7, 9, 7, 9, 11] は、両方のリストからの要素が同じ場合を除いた、異なるペアの合計を反映しています。

リスト内包表記は、簡潔で表現力のある構文により、コード構造を簡素化し、可読性を向上させるため、Python でネストされた for ループを書くために推奨されます。これにより、複雑なネストされた反復処理を 1 行で書くことが容易になります。

Python で exec() 関数を使用して 1 行でネストされた for ループを書く方法

次に、1 行でネストされた for ループを実現するために役立つ別の関数、exec() 関数について説明します。Python の exec() 関数は、文字列またはコードオブジェクトに保存された Python プログラムを動的に実行するために使用され、動的に生成された Python コードを実行することができます。

基本構文:

exec(object)

構文では、object は Python プログラムを含む文字列またはコードオブジェクトです。

それでは、2つのリストを加算して合計を出力する例を見てみましょう。

例コード 1:

listOne = [1, 3, 5]
listTwo = [2, 4, 6]

exec("for a in listOne:\n    for b in listTwo:\n      print(a+b)")

出力:

3
5
7
5
7
9
7
9
11

上記のコードでは、listOnelistTwo という 2つのリストがあります。exec() 関数を使用して、ネストされた for ループを動的に実行し、listOnelistTwo からのすべての要素の組み合わせを反復処理します。

ループ内で、print(a + b) ステートメントを使用して各ペア (a, b) の合計を出力します。

次に、.join() 文字列メソッドを使用して、指定された文字列をセパレータ("\n")として使用して、リスト(listOnelistTwo)の要素を連結(結合)する別の例を見てみましょう。

例コード 2:

listOne = [1, 3, 5]
listTwo = [2, 4, 6]

expression = "\n".join(
    f"a = {a}; b = {b}; print(a + b)" for a in listOne for b in listTwo
)
exec(expression)

出力:

3
5
7
5
7
9
7
9
11

上記のコードでは、listOnelistTwo という 2つのリストから始めます。リスト内包表記を使用して、2つのリストのデカルト積からの各ペア (a, b) の合計のフォーマットされた print ステートメントを結合して、文字列 expression を作成します。

次に、f-string 構文を使用して、ab の値を組み込んだフォーマットされた print ステートメントを含むジェネレータ式を使用して expression を構築します。"\n".join() メソッドを適用して、これらのフォーマットされた print ステートメントを改行文字で区切って連結します。

その後、exec() 関数を使用して、生成された文字列 expression を動的に実行します。実行中に、文字列内の各フォーマットされた print ステートメントが評価され、すべての可能な組み合わせの合計が出力されます。

ただし、この方法で exec() を使用することは、可読性とセキュリティの理由から一般的には推奨されません。リスト内包表記を使用する方が通常は良いアプローチです。

結論

結論として、この記事では、Python で 1 行でネストされた for ループを実現するための 2つの方法を紹介しました。まず、リスト内包表記の使用を強調し、その簡潔で表現力のある構文を可読性の観点から推奨しました。

2 番目の方法は、exec() 関数を使用してネストされたループを動的に実行する方法を示しました。ただし、exec() を定期的に使用することは、可読性とセキュリティの懸念から注意が必要であり、ほとんどの場合、リスト内包表記を優先することが再確認されました。

チュートリアルを楽しんでいますか? <a href="https://www.youtube.com/@delftstack/?sub_confirmation=1" style="color: #a94442; font-weight: bold; text-decoration: underline;">DelftStackをチャンネル登録</a> して、高品質な動画ガイドをさらに制作するためのサポートをお願いします。 Subscribe
Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn

関連記事 - Python Loop