itertools.chain
リストの効率的な連結(メモ化)に使用したいのですがmap
、結果を複数回読み取る(またはなど)必要があります。次の例は、問題を示しています。
import itertools
a = itertools.chain([1, 2], [3, 4])
print list(a) # => [1, 2, 3, 4]
print list(a) # => []
この問題を回避する最善の方法は何ですか?
itertools.chain
リストの効率的な連結(メモ化)に使用したいのですがmap
、結果を複数回読み取る(またはなど)必要があります。次の例は、問題を示しています。
import itertools
a = itertools.chain([1, 2], [3, 4])
print list(a) # => [1, 2, 3, 4]
print list(a) # => []
この問題を回避する最善の方法は何ですか?
すべてのジェネレーターと同様に、それをリストに変換し、代わりにその結果を保存する必要があります。
a = list(a)
これはジェネレーターの基本原則であり、シーケンスを一度だけ生成することが期待されています。
さらに、基になるリストが変更される可能性があるため、メモ化の目的でジェネレーターを単純に保存することはできません。ほとんどすべてのメモ化のユースケースでは、代わりにリストを保存する必要があります。ジェネレーターは通常、基になるシーケンスを効率的に変換またはフィルター処理する手段にすぎず、メモ化したいデータ自体を表すものではありません。出力ではなく、関数を格納しているようなものです。特定のケースで、実行していることのすべてがchain()
既存のリストを連結するために使用している場合は、代わりにそれらのリストを直接保存してください。
これにより、ジェネレーターが無限のシーケンスを生成できるようになるため、リストへの変換には注意してください。
itertools.tee を試してください:
import itertools
a = itertools.chain([1, 2], [3, 4])
a, b = itertools.tee(a)
print list(b) # => [1, 2, 3, 4]
a, b = itertools.tee(a)
print list(b) # => [1, 2, 3, 4]