我想使用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()
用来连接现有列表,请直接存储这些列表。
请注意,这使生成器能够生成无穷无尽的序列,因此在转换为列表时要小心。
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]