ジェネレータオブジェクトを反転する方法を探しています。私はシーケンスを逆にする方法を知っています:
foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))
しかし、ジェネレーターを入力として、逆ジェネレーターを出力として(len(seq)は同じままなので、元のシーケンスの値を使用できます)、同様のことが可能ですか?
ジェネレーターをシーケンスにキャストし、そこから反復子を作成する以外の一般的な方法でジェネレーターを逆にすることはできません。ジェネレーターの後の項は、前の項が計算されるまで、必ずしも知ることはできません。
さらに悪いことに、ジェネレーターが StopIteration 例外をヒットするまで、それがヒットするかどうかはわかりません。
あなたができる最善のことは、reversed_iterator 関数を書くことです:
def reversed_iterator(iter):
return reversed(list(iter))
編集: もちろん、これの reversed を imap ベースの反復バージョンに置き換えて、1 つのリスト作成を保存することもできます。
reversed(list(input_generator))
おそらく最も簡単な方法です。
2 番目の項目の生成は、最初の項目が生成されていることに大きく依存する可能性があるため、最初にすべての値をシーケンスに収集せずに、ジェネレーターの値を「逆」の順序で取得する方法はありません。
最初のアイテムを取得するには、とにかくジェネレーターをたどる必要があるため、リストを作成することもできます。試す
reversed(list(g))
g
ジェネレーターはどこにありますか。
reversed(tuple(g))
同様に機能します(パフォーマンスに大きな違いがあるかどうかは確認していません)。