【问题标题】:Chunking a generator [duplicate]分块生成器[重复]
【发布时间】:2021-09-18 10:17:28
【问题描述】:

我在这里做错了什么。尝试使用 islice 获取生成器的块,但似乎无限运行。

from itertools import islice

size = 2

def g():
    for x in range(11):
        print("generating: ", x)
        yield x

while True:
    chunk = islice(g(), size)
    if not chunk:
        break
    print("at chunk")
    for c in chunk:
        print(c)

我得到一个输出,它似乎只是永远循环并且似乎没有增加:

at chunk
generating:  0
0
generating:  1
1
at chunk
generating:  0
0
generating:  1
1
at chunk
generating:  0
0
generating:  1
1
at chunk

【问题讨论】:

  • 你在 while 循环的每次迭代中创建一个新的生成器(从 0 开始)...
  • 所有islice 实例都是真实的。如果不实际迭代它,你无法知道它会产生多少项目。
  • 你想在这里实现什么?那你得到了什么?
  • itertools 文档中的grouper 配方进行比较,该配方使用对同一底层迭代器的多个引用来获取顺序块。

标签: python generator itertools


【解决方案1】:

每次调用g() 时,都会从头重新启动生成器。您需要将结果分配给一个变量,以便它继续使用相同的生成器。

正如评论中提到的,islice 对象始终是真实的。要判断您是否到达终点,请检查 for c in chunk: 循环是否执行任何操作。

from itertools import islice

def g():
    for x in range(11):
        print("generating: ", x)
        yield x

size = 2
gen = g()
while True:
    chunk = islice(gen, size)

    print("at chunk")
    empty = True
    for c in chunk:
        print(c)
        empty = False

    if empty:
        break

【讨论】:

  • 谢谢,这正是我想要的。我没有意识到我每次都在启动一个新的发电机
猜你喜欢
  • 2021-11-12
  • 2013-09-03
  • 2017-02-16
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2014-01-06
相关资源
最近更新 更多