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
ステートメントを含めることもできます。
リスト内包表記を使用した例を見てみましょう。まず、listOne
と listTwo
という 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
上記のコードでは、listOne
と listTwo
という 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]
上記のコードでは、listOne
と listTwo
という 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
上記のコードでは、listOne
と listTwo
という 2つのリストがあります。exec()
関数を使用して、ネストされた for
ループを動的に実行し、listOne
と listTwo
からのすべての要素の組み合わせを反復処理します。
ループ内で、print(a + b)
ステートメントを使用して各ペア (a, b)
の合計を出力します。
次に、.join()
文字列メソッドを使用して、指定された文字列をセパレータ("\n"
)として使用して、リスト(listOne
と listTwo
)の要素を連結(結合)する別の例を見てみましょう。
例コード 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
上記のコードでは、listOne
と listTwo
という 2つのリストから始めます。リスト内包表記を使用して、2つのリストのデカルト積からの各ペア (a, b)
の合計のフォーマットされた print ステートメントを結合して、文字列 expression
を作成します。
次に、f-string
構文を使用して、a
と b
の値を組み込んだフォーマットされた print ステートメントを含むジェネレータ式を使用して expression
を構築します。"\n".join()
メソッドを適用して、これらのフォーマットされた print ステートメントを改行文字で区切って連結します。
その後、exec()
関数を使用して、生成された文字列 expression
を動的に実行します。実行中に、文字列内の各フォーマットされた print ステートメントが評価され、すべての可能な組み合わせの合計が出力されます。
ただし、この方法で exec()
を使用することは、可読性とセキュリティの理由から一般的には推奨されません。リスト内包表記を使用する方が通常は良いアプローチです。
結論
結論として、この記事では、Python で 1 行でネストされた for
ループを実現するための 2つの方法を紹介しました。まず、リスト内包表記の使用を強調し、その簡潔で表現力のある構文を可読性の観点から推奨しました。
2 番目の方法は、exec()
関数を使用してネストされたループを動的に実行する方法を示しました。ただし、exec()
を定期的に使用することは、可読性とセキュリティの懸念から注意が必要であり、ほとんどの場合、リスト内包表記を優先することが再確認されました。
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