首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在发电机清单中的发电机耗尽后,继续使用其他发电机?

在发电机清单中的发电机耗尽后,继续使用其他发电机?
EN

Stack Overflow用户
提问于 2021-10-28 03:59:34
回答 2查看 205关注 0票数 5

我有一个函数alternate_all(*args)中的生成器列表,在列表中的每个生成器之间交替打印第一项、第二项、.等等,直到所有生成器用完为止。

我的代码一直工作到生成器耗尽,一旦发生StopIteration,它就停止打印,当我希望它继续使用其余的生成器时,忽略耗尽的生成器:

代码语言:javascript
复制
def alternate_all(*args):
    iter_list = []
    for iterable in args:
        iter_list.append(iter(iterable))
    try:
        while True:
            for iterable in iter_list:
                val = next(iter_list[0])
                iter_list.append(iter_list.pop(0))
                yield val
    except StopIteration:
        pass

            
if __name__ == '__main__':
    for i in alternate_all('abcde','fg','hijk'):
        print(i,end='')

我的产出是:

代码语言:javascript
复制
afhbgic

当它应该是:

代码语言:javascript
复制
afhbgicjdke

我怎么能让这个无视耗尽的发电机?我不喜欢使用迭代工具,保持相同的结构。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-28 04:54:09

这个很管用。我试图了解您的原始代码是如何工作的(尽管为了简单起见,我确实用列表理解替换了您的第一个循环)。

代码语言:javascript
复制
def alternate_all(*args):
    iter_list = [iter(arg) for arg in args]
    while iter_list:
        i = iter_list.pop(0)
        try:
            val = next(i)
        except StopIteration:
            pass
        else:
            yield val
            iter_list.append(i)

代码的主要问题是try/except在循环之外,这意味着第一个耗尽的迭代器将退出循环。相反,您希望在循环中捕获StopIteration,这样您就可以继续运行,并且循环应该继续运行,而iter_list中仍然有任何迭代器。

票数 4
EN

Stack Overflow用户

发布于 2021-10-28 04:40:34

迭代工具-菜谱roundrobin,直接从itertools文档中得到,怎么样?不过,你最终还是会使用itertools.cycleitertools.islice,但不确定这是否会破坏交易。

代码语言:javascript
复制
def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    # Recipe credited to George Sakkis
    num_active = len(iterables)
    nexts = cycle(iter(it).__next__ for it in iterables)
    while num_active:
        try:
            for next in nexts:
                yield next()
        except StopIteration:
            # Remove the iterator we just exhausted from the cycle.
            num_active -= 1
            nexts = cycle(islice(nexts, num_active))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69748145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档