7

itertools.chainリストの効率的な連結(メモ化)に使用したいのですがmap、結果を複数回読み取る(またはなど)必要があります。次の例は、問題を示しています。

import itertools
a = itertools.chain([1, 2], [3, 4])
print list(a) # => [1, 2, 3, 4]
print list(a) # => []

この問題を回避する最善の方法は何ですか?

4

2 に答える 2

12

すべてのジェネレーターと同様に、それをリストに変換し、代わりにその結果を保存する必要があります。

a = list(a)

これはジェネレーターの基本原則であり、シーケンスを一だけ生成することが期待されています。

さらに、基になるリストが変更される可能性があるため、メモ化の目的でジェネレーターを単純に保存することはできません。ほとんどすべてのメモ化のユースケースでは、代わりにリストを保存する必要があります。ジェネレーターは通常、基になるシーケンスを効率的に変換またはフィルター処理する手段にすぎず、メモ化したいデータ自体を表すものではありません。出力ではなく、関数を格納しているようなものです。特定のケースで、実行していることのすべてがchain()既存のリストを連結するために使用している場合は、代わりにそれらのリストを直接保存してください。

これにより、ジェネレーターが無限のシーケンスを生成できるようになるため、リストへの変換には注意してください。

于 2012-10-31T11:10:51.863 に答える
4

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]
于 2012-10-31T11:13:14.407 に答える