li = [0, 1, 2, 3] running = True while running: for elem in li: thiselem = elem nextelem = li[li.index(elem)+1]
当它到达最后一个元素时,将IndexError引发an (对于任何迭代的列表,元组,字典或字符串都是这种情况)。实际上,我实际上希望在这一点nextelem上平等li[0]。我对此比较麻烦的解决方案是
IndexError
nextelem
li[0]
while running: for elem in li: thiselem = elem nextelem = li[li.index(elem)-len(li)+1] # negative index
有更好的方法吗?
经过仔细考虑之后,我认为这是最好的方法。它使您无需使用即可轻松过渡到中间break,我认为这很重要,而且所需的计算量最少,因此我认为这是最快的。它也不需要li是列表或元组。它可以是任何迭代器。
break
li
from itertools import cycle li = [0, 1, 2, 3] running = True licycle = cycle(li) # Prime the pump nextelem = next(licycle) while running: thiselem, nextelem = nextelem, next(licycle)
我将其他解决方案留给后代。
所有这些花哨的迭代器内容都有其位置,但不在这里。使用%运算符。
li = [0, 1, 2, 3] running = True while running: for idx, elem in enumerate(li): thiselem = elem nextelem = li[(idx + 1) % len(li)]
现在,如果您打算无限循环浏览列表,则只需执行以下操作:
li = [0, 1, 2, 3] running = True idx = 0 while running: thiselem = li[idx] idx = (idx + 1) % len(li) nextelem = li[idx]
我认为,这比涉及的其他解决方案更容易理解tee,而且也可能更快。如果您确定列表不会更改大小,则可以松开副本len(li)并使用它。
tee
len(li)
这也使您可以轻松地从中间踩下摩天轮,而不必等待铲斗再次下降到底部。其他解决方案(包括您的解决方案)要求您running在for循环的中间进行检查,然后再进行检查break。
running
for