次のようなコードに出くわしました。
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
これは次と同等ですか:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
それとも、ネストされた for ステートメント以外の何かを示していますか?
次のようなコードに出くわしました。
queue = [(Xi, Xk) for Xi in csp.vars for Xk in csp.neighbors[Xi]]
これは次と同等ですか:
for Xi in csp.vars:
for Xk in csp.neighbors[Xi]:
queue.append((Xi, Xk))
それとも、ネストされた for ステートメント以外の何かを示していますか?
あなたはそれを正確に持っています。リスト内包表記のドキュメントを参照してください:
リスト内包表記が指定されている場合、それは単一の式の後に少なくとも 1 つの
for
句と 0 個以上のfor
orif
句が続くもので構成されます。この場合、新しいリストの要素は、各for
orif
句をブロックと見なし、左から右にネストし、最も内側のブロックに到達するたびに式を評価してリスト要素を生成することによって生成される要素です。
したがって、 for ループのネストの解釈は適切です。
他の人がすでに指摘したように、それはまさにそれが意味することです。
また、リスト内包表記/ genexp内で複数を使用すると混乱することがあるので、通常はそれらを避けます。私がそれらを使用するとき、私は通常、次のようにすべてを異なる行に配置します。
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
またはインデントさえ:
queue = [(Xi, Xk) for Xi in csp.vars
for Xk in csp.neighbors[Xi]]
これにより、どちらが内側のforループであるかが明確になります。
また、list-comprehensionはすべてのforループに対してif式を持つことができるため、完全な構文は次のようになります。
queue = [(Xi, Xk) for Xi in csp.vars
if condition_one()
for Xk in csp.neighbors[Xi]
if condition_two()
... ]
そんなことは絶対に書いてはいけないと思いますが。最後のif式は問題ありませんが、forと組み合わせると、煩雑になり、まったく読みにくくなります。