如何存储itertools.chain并多次使用它?

时间:2012-10-31 11:09:46

标签: python memoization itertools

我想使用itertools.chain来有效连接列表(memoization),但我需要能够多次读取(或map等)结果。这个例子说明了这个问题:

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

避免此问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:12)

与所有生成器一样,您需要将其转换为列表并存储该结果:

a = list(a)

这是生成器的基本原理,它们只能生成一次的序列。

此外,您不能简单地存储生成器以进行记忆,因为基础列表可能会更改。在几乎所有的memoization用例中,你应该存储列表;生成器通常只是一种有效转换或过滤底层序列的方法,并不代表您想要自己记忆的数据。这就像存储一个函数,而不是它的输出。在您的具体情况下,如果您正在使用chain()连接现有列表,直接存储这些列表

请注意,这使得生成器可以生成无穷无尽的序列,因此请小心转换为列表。

答案 1 :(得分: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]