在python中以递增方式生成序列

时间:2014-03-06 05:52:30

标签: python generator yield

    def generator_zip(seq1, seq2, *more_seqs):
    if more_seqs==():
        t=min(len(seq1),len(seq2))
        for x in range(t):
          yield (seq1[x],seq2[x])
    else:
       t=min(len(seq1),len(seq2),len(more_seqs))
       for x in range(t+1):
           z=(seq1[x],seq2[x])+tuple([more_seqs[i][x] for i in range(len(more_seqs))])
           yield z

    assert [(1, 'a'), (2, 'b')] == list(generator_zip((1, 2), "abcd"))
    assert [(1, 'a', 1), (2, 'b', 2)] == list(generator_zip(range(1, 5), "abc", [1, 2]))
    list(generator_zip(range(1, 5), "abc", [1, 2],[1]))

但它会引发上述条件的错误。 这有什么问题?

1 个答案:

答案 0 :(得分:1)

t=min(len(seq1),len(seq2),len(more_seqs))
#                         ^

这不是剩余序列的最小长度。这是给出的附加序列的数量。如果你想要多个序列中最短的长度,那就是

min(len(seq) for seq in sequences)

但是,您可能不应该在序列和索引方面这样做。 zip适用于任何类型的可迭代输入。获取输入迭代的迭代器,next它们,并得到结果的元组。您可以让从输入迭代器传播的StopIteration传播到信号完成。

def zip2(*iterables):
    if iterables:
        iterators = [iter(iterable) for iterable in iterables]
        while True:
            yield tuple(next(iterator) for iterator in iterators)