最高の情報源はofficial Python tutorial on list comprehensionsです。リスト内包はforループとほとんど同じです(確かにリスト内包はforループとして書くことができます)が、forループを使用するよりもしばしば高速です。
>>> [(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)]
:
チュートリアルからこの長いリストの内包を見てみると、(if
部分は、ここではリスト内包((x,y)
)の最後の部分に渡され、if文を渡し、部品のみ理解をフィルタリングこれは、forループのネストされたこのとまったく同じです(チュートリアルが言うようにする方法についての順、注意してください、とと同じ場合)。
>>> 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ループの最後の部分(何かを行う場所)が最後ではなく最初に来るということです。ご質問には
:
どのような種類のループ構造のためにこれを使用するために対象物なければなりませんか?
iterable。要素の(有限の)集合を生成することができる任意のオブジェクト。
オブジェクトの要素にiとjを割り当てる順序はどのようなものですか?
これらは、ネストされたforループのように、各リストから生成されたものと全く同じ順序で割り当てられます(最初の理解では、iの要素を1つ、jのすべての値、2番目の要素をi、jのすべての値など)
別のforループ構造でシミュレートできますか?
はい、上記のとおりです。
このforループは、ループのための類似の構造または異なる構造でネストできますか?そしてそれはどのように見えるでしょうか?
確かに、それは素晴らしい考えではありません。ここでは、例えば、あなたの文字のリストのリストを与える:すべての
[[ch for ch in word] for word in ("apple", "banana", "pear", "the", "hello")]
となります。ダブルネストでは、どのような順序付けを選択したのでしょうか。私は他のやり方が自然であることを見いだしています(あなたの例ではyの場合はxです)。私は、Pythonを(広範囲ではありませんがまだ... ...)やそのようなループを使用して3年後に実現しました! – Thomas
よく言って、ありがとう! –