如果我有多个Iterables作为参数,并且在列表之一引发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 = []
这是我当前的结果,它确实存储了b,g,i,但它只打印出第一张列表:
[('a', 'f', 'h')]
获得这样的结果的最佳方法是什么? 结果是列表中的元组,当参数iterables用尽时,它将替换为Nones。
[('a', 'f', 'h'), ('b', 'g', 'i'), ('c', None, 'j'), ('d', None, 'k'), ('e', None, None)]
我知道StopIteration错误在('b','g','i')之后出现,但是有什么办法可以忽略并继续使用其他列表?
输入内容如下:
[v for v in together(disguise('abcde'), disguise('fg'), disguise('hijk'))]
伪装功能如下:
def disguise(items):
for v in items:
yield v
任何建议或帮助将不胜感激!
答案 0 :(得分:3)
您可以使用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)]