继续,直到所有迭代器都完成Python

时间:2015-05-07 23:16:36

标签: python generator iterable

我不能使用itertools

所以编码看起来很简单,但是我很难想到算法能保持生成器运行,直到所有迭代都被完全处理完毕。

该功能的想法是将2个迭代作为参数,如...

(['a', 'b', 'c', 'd', 'e'], [1,2,5])

它的作用是产生这些价值......

a, b, b, c, c, c, c, c

但是,如果第二个iterable首先用完了元素,那么函数只会迭代剩余的值一次......

所以剩余的值会像这样重复:

d, e

def iteration(letters, numbers):
    times = 0
    for x,y in zip(letters, numbers):
        try:
            for z in range(y):
                yield x
        except:
            continue

[print(x) for x in iteration(['a', 'b', 'c', 'd'], [1,2,3])]

我无法忽略第一个StopIteration并继续完成。

2 个答案:

答案 0 :(得分:18)

下次使用默认值1,以便至少打印一次字母:

def iteration(letters, numbers): 
     # create iterator from numbers
    it = iter(numbers)
    # get every letter
    for x in letters:
        # either print in range passed or default range of 1
        for z in range(next(it, 1)):
            yield x

输出:

In [60]: for s in iteration(['a', 'b', 'c', 'd', 'e'], [1,2,5]):
   ....:     print(s)
   ....:     
a
b
b
c
c
c
c
c
d
e

答案 1 :(得分:2)

阅读zip()的文档。它说: “zip()只应与不等长度输入一起使用,如果你不关心较长迭代的尾随,不匹配的值。如果这些值很重要,请使用itertools.zip_longest()代替。”