4

内側のリスト内包表記で外側のリスト内包表記の値を使用しようとしました。

[ x for x in range(y) for y in range(3) ]

ただし、残念ながら、名前が不明であるため、これによりNameErrorが発生しますy(ただし、外部リスト内包表記で指定されています)。

これはPythonの制限(2.7.3および3.2.3を試した)ですか、それともこれが機能しない正当な理由がありますか?

制限を取り除く計画はありますか?

私が望むものを達成するための回避策(おそらく私が理解していなかったいくつかの異なる構文)はありますか?

4

3 に答える 3

16

ジェネレーター式ではなく、リスト内包表記について話している。

for ループを交換する必要があります。

[ x for y in range(3) for x in range(y) ]

これらは、通常のループにネストされているかのように読み取る必要があります。

for y in range(3):
    for x in range(y):
        x

複数のループを含むリスト内包表記は、同じ順序に従います。リスト内包表記のドキュメントを参照してください:

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

もちろん、同じことがジェネレーター式にも当てはまりますが、これら()は角括弧の代わりに括弧を使用しており、すぐには具体化されません。

>>> (x for y in range(3) for x in range(y))
<generator object <genexpr> at 0x100b50410>
>>> [x for y in range(3) for x in range(y)]
[0, 0, 1]
于 2012-08-13T12:42:16.007 に答える
1

試しましたか:

[x for y in range(3) for x in range(y)]

それは出力を生成するため...これは以下を生成します:

[0, 0, 1]

あなたが望んでいたものかもしれませんし、そうでないかもしれません....

于 2012-08-13T12:44:35.390 に答える
0

別の世代をネストするだけです。

[ x for x in [range(y) for y in range(3) ]]

私に与えます:

[[], [0], [0, 1]]
于 2012-08-13T12:43:06.213 に答える