gpt4 book ai didi

python - 如何创建一个生成器在 StopIteration 之后继续运行?

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:37 25 4
gpt4 key购买 nike

如果我有多个可迭代对象作为参数,有没有办法让代码在列表之一引发 StopIteration 之后继续运行?

我不能使用任何切片、len() 或任何 itertools。

这是我迄今为止尝试过的方法,我知道这是完全错误的,但我就是想不通。

def together(*args):
iterator = [iter(item) for item in args]
my_list = []

while True:
for i in iterator:
try:
lst.append(next(i))
print(next(i))
except StopIteration:
return
if '__next__' == None:
yield tuple(None)
else:
yield tuple(my_list)
my_list = []

这是我当前的结果,iter do store b,g,i 但它只打印出第一个列表:

[('a', 'f', 'h')]

获得这样结果的最佳方法是什么?结果是列表中的元组,当参数 iterables 用完时,它会被替换为 Nones。

[('a', 'f', 'h'), ('b', 'g', 'i'), ('c', None, 'j'), ('d', None, 'k'), ('e', None, None)]

我知道在 ('b','g','i') 之后会出现 StopIteration 错误,但是有什么方法可以忽略并继续使用不同的列表吗?

输入看起来像:

[v for v in together(disguise('abcde'), disguise('fg'), disguise('hijk'))]

伪装函数如下:

def disguise(items):
for v in items:
yield v

任何建议或帮助将不胜感激!

最佳答案

您可以使用 next 的第二个参数让 next 返回一个默认值,而不是在给定迭代器运行时引发 StopIteration 异常筋疲力尽:

def together(*seqs):
seqs = list(map(iter, seqs))
while True:
group = tuple(next(seq, None) for seq in seqs)
if all(i is None for i in group):
return
yield group

这样:

list(together('abcde', 'fg', 'hijk'))

返回:

[('a', 'f', 'h'), ('b', 'g', 'i'), ('c', None, 'j'), ('d', None, 'k'), ('e', None, None)]

关于python - 如何创建一个生成器在 StopIteration 之后继续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54583540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com