2

次のようなコードに出くわしました。

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 ステートメント以外の何かを示していますか?

4

2 に答える 2

4

あなたはそれを正確に持っています。リスト内包表記のドキュメントを参照してください:

リスト内包表記が指定されている場合、それは単一の式の後に少なくとも 1 つのfor句と 0 個以上のfororif句が続くもので構成されます。この場合、新しいリストの要素は、各fororif句をブロックと見なし、左から右にネストし、最も内側のブロックに到達するたびに式を評価してリスト要素を生成することによって生成される要素です。

したがって、 for ループのネストの解釈は適切です。

于 2012-10-19T16:39:36.913 に答える
2

他の人がすでに指摘したように、それはまさにそれが意味することです。

また、リスト内包表記/ 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と組み合わせると、煩雑になり、まったく読みにくくなります。

于 2012-10-19T16:45:26.397 に答える