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 回答