最良の情報源は、リスト内包表記に関する公式のPythonチュートリアルです。リスト内包表記はforループとほぼ同じです(確かにリスト内包表記はforループとして記述できます)が、forループを使用するよりも高速であることがよくあります。
チュートリアルからこのより長いリスト内包を見てください(if
パートは内包をフィルターし、ifステートメントを渡す部分のみがリスト内包の最後の部分に渡されます(ここ(x,y)
)):
>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
これは、このネストされたforループとまったく同じです(チュートリアルで言うように、forとifの順序が同じであることに注意してください)。
>>> combs = []
>>> for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
リスト内包表記とforループの主な違いは、forループの最後の部分(何かを行う場所)が最後ではなく最初に来るということです。
あなたの質問に:
このforループ構造を使用するには、オブジェクトがどのタイプである必要がありますか?
反復可能。(有限)要素のセットを生成できるオブジェクト。これらには、コンテナ、リスト、セット、ジェネレータなどが含まれます。
iとjがオブジェクトの要素に割り当てられる順序は何ですか?
それらは、ネストされたforループ内にあるかのように、各リストから生成されたのとまったく同じ順序で割り当てられます(最初の理解では、iに対して1つの要素を取得し、次にjからのすべての値、2番目の要素からiに、次に、jからのすべての値など)
別のforループ構造でシミュレーションできますか?
はい、すでに上に表示されています。
これのforループは、forまたはloopの構造が同じか異なる入れ子にできますか?そしてそれはどのように見えますか?
確かに、それは素晴らしいアイデアではありません。たとえば、ここでは、文字のリストのリストが表示されます。
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]