4

我正在编写一个生成器函数。我想知道是否有更好的(阅读:更多pythonic,最好是列表理解)方法来实现这样的东西:

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

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

4

2 回答 2

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

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

于 2012-09-28T21:24:01.750 回答
0

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

directories = [item['name'] for item in itertools.islice(gen(), x)]
于 2012-09-28T21:52:11.077 回答