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]))
但它会引发上述条件的错误。 这有什么问题?
答案 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)