在列表理解中捕获并产生

时间:2012-09-28 21:18:31

标签: python iteration generator list-comprehension

我正在写一个生成器函数。我想知道是否有一个更好的(阅读:更多pythonic,理想情况下具有列表理解)方式来实现这样的事情:

generator = gen()
captures = []
for _ in xrange(x):
    foo = next(generator)
    directories.append(foo['name'])
    yield foo

这里的关键是我不想捕获整个产量 - gen()返回的字典很大,这就是我使用生成器的原因。不过,我确实需要捕捉所有'名字'。我觉得有一种方法可以通过列表理解来实现这一点,但我只是没有看到它。想法?

2 个答案:

答案 0 :(得分:6)

还有另一种/更短的方法可以做到这一点,但我不会称之为Pythonic:

generator = gen()
directories = []
generator_wrapper = (directories.append(foo['name']) or foo 
                         for foo in generator)

这利用了这样一个事实:append与Python中的所有变异方法一样,始终返回None,因此.append(...) or foo将始终评估为foo

这样整个字典仍然是生成器表达式的结果,你仍然得到延迟评估,但名称仍然保存到directories列表。

您也可以在显式for循环中使用此方法:

for foo in generator:
    yield directories.append(foo['name']) or foo

或者甚至只是简化你的循环:

for foo in generator:
    directories.append(foo['name'])
    yield foo

因为没有理由使用xrange来迭代生成器(除非你实际上只想迭代一些已知数量的步骤)。

答案 1 :(得分:0)

您想要生成器的第一个x个元素吗?使用itertools.islice

directories = [item['name'] for item in itertools.islice(gen(), x)]