就地链接迭代器

时间:2019-07-02 10:10:51

标签: python python-3.x

在迭代时是否有扩展迭代器的方法。

我想遍历请求,以防它们超时,我想拆分请求并将其添加到运行循环中。

类似这样的东西:

l = [1, 2, 3, 4, 5]
it = iter(l)
for e in it:
  try: 
    request(e)
  except Exception:
    it.append(split_request(e))

但是append不起作用,itertools.chain返回一个新的迭代器,而不是就地更改迭代器。

3 个答案:

答案 0 :(得分:2)

您需要一个while循环。在其中,遍历列表并累积失败条目的列表。当该列表为空时,while循环可以终止。像这样:

while l:
    failures = []
    for e in l:
        try:
            request(e)
        except Exception:
            failures.append(split_request(e))
    l = failures

应该这样做。

答案 1 :(得分:1)

您只需要一个while循环并处理索引并自己迭代

l = [1, 2, 3, 4, 5]
i = 0
while i < len(l):
  try: 
    request(l[i])
    i += 1
  except Exception:
    l[i] = split_request(l[i])

答案 2 :(得分:1)

下面的代码两次尝试每个列表,并输出一个字典,该字典的值导致错误和尝试次数。您可以将errors列为列表,如果len(errors)太大则停止附加。

import itertools
l = [-2, -1, 0, 1, 'a', 2]
it = iter(l)
errors = {}
for e in itertools.chain(it, errors):
    try:
        print('e =', e, ' 1/e = ', end=' ')
        print(1/e)                              <---- May Fail 
    except Exception:
        errors[e] = errors.get(e, 0) + 1
        print('Error')

print('errors', errors)

O / P

e = -2  1/e =  -0.5
e = -1  1/e =  -1.0
e = 0  1/e =  Error
e = 1  1/e =  1.0
e = a  1/e =  Error
e = 2  1/e =  0.5
e = 0  1/e =  Error
e = a  1/e =  Error
>>> print('errors', errors)
errors {0: 2, 'a': 2}