4

ジェネレータ関数を書いています。次のようなものを実装するためのより良い方法があるかどうかを知りたいです(読む:よりpythonic、理想的にはリスト内包表記を使用):

generator = gen()
captures = []
for _ in xrange(x):
    foo = next(generator)
    directories.append(foo['name'])
    yield foo

ここで重要なのは、利回り全体をキャプチャしたくないということです。返される辞書gen()は大きいため、ジェネレーターを使用しています。ただし、すべての「名前」をキャプチャする必要があります。リスト内包表記でこれを行う方法があるように感じますが、私はそれを見ていません。考え?

4

2 に答える 2

6

これを行う別の/より短い方法がありますが、私はそれをよりPythonicとは呼びません:

generator = gen()
directories = []
generator_wrapper = (directories.append(foo['name']) or foo 
                         for foo in generator)

appendこれは、Python のすべての変更メソッドと同様に、常に を返すNoneため、.append(...) or foo常に に評価されるという事実を利用していますfoo

そうすれば、ディクショナリ全体がジェネレータ式の結果のままであり、遅延評価が行われますが、名前はdirectoriesリストに保存されます。

このメソッドを明示的なforループで使用することもできます。

for foo in generator:
    yield directories.append(foo['name']) or foo

または、ループを少し単純化することもできます:

for foo in generator:
    directories.append(foo['name'])
    yield foo

ジェネレーターを反復処理するためだけにを使用する理由はありませんxrange(既知のステップ数だけを実際に反復処理したい場合を除きます)。

于 2012-09-28T21:24:01.750 に答える
0

ジェネレーターの最初xの多くの要素が必要ですか? 使用itertools.islice:

directories = [item['name'] for item in itertools.islice(gen(), x)]
于 2012-09-28T21:52:11.077 に答える