列表理解中的捕获与屈服

2024-04-26 00:55:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

这里的关键是我不想获取整个收益率,gen()返回的字典很大,这就是我使用生成器的原因。不过,我需要把所有的名字都记录下来。我觉得有一种方法可以通过列表理解来实现,但是我没有看到。思想?在


Tags: 方法函数namein列表forfoogenerator
2条回答

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

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

还有另一种/更短的方法可以做到这一点,但我不会说它更像Python:

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

这利用了这样一个事实,即append与Python中的所有变异方法一样,总是返回None,因此.append(...) or foo的计算结果总是foo。在

这样,整个字典仍然是生成器表达式的结果,您仍然可以得到延迟求值,但是名称仍然保存到directories列表中。在

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

^{pr2}$

或者干脆简化一下你的循环:

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

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

相关问题 更多 >

    热门问题