【问题标题】:generating a sequence incrementally in python在python中增量生成序列
【发布时间】:2014-03-06 05:52:29
【问题描述】:
    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]))

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

【问题讨论】:

  • 错误信息是什么?
  • 条件的错误是列表索引超出范围@tripleee
  • 请完整回溯。

标签: python generator yield


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多