我想使用itertools.chain
来有效连接列表(memoization),但我需要能够多次读取(或map
等)结果。这个例子说明了这个问题:
import itertools
a = itertools.chain([1, 2], [3, 4])
print list(a) # => [1, 2, 3, 4]
print list(a) # => []
避免此问题的最佳方法是什么?
答案 0 :(得分:12)
与所有生成器一样,您需要将其转换为列表并存储该结果:
a = list(a)
这是生成器的基本原理,它们只能生成一次的序列。
此外,您不能简单地存储生成器以进行记忆,因为基础列表可能会更改。在几乎所有的memoization用例中,你应该存储列表;生成器通常只是一种有效转换或过滤底层序列的方法,并不代表您想要自己记忆的数据。这就像存储一个函数,而不是它的输出。在您的具体情况下,如果您正在使用chain()
连接现有列表,直接存储这些列表。
请注意,这使得生成器可以生成无穷无尽的序列,因此请小心转换为列表。
答案 1 :(得分:4)
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]