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


问题内容

我想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()用来连接现有列表,请
直接存储这些列表

请注意,这使生成器可以产生无穷的序列,因此在转换为列表时要格外小心。