li = [0, 1, 2, 3]
running = True
while running:
for elem in li:
thiselem = elem
nextelem = li[li.index(elem)+1]
当它到达最后一个元素时,会引发 IndexError
(对于任何迭代的列表、元组、字典或字符串都是如此)。我实际上希望 nextelem
等于 li[0]
。我对此相当麻烦的解决方案是
while running:
for elem in li:
thiselem = elem
nextelem = li[li.index(elem)-len(li)+1] # negative index
有更好的方法吗?
最佳答案
仔细考虑后,我认为这是最好的方法。它可以让你在不使用我认为很重要的 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)
的副本并使用它。
这也让您可以轻松地从中间走下摩天轮,而不必等待水桶再次落到底部。其他解决方案(包括您的)要求您在 for
循环中间检查 running
,然后检查 break
。
关于python - 循环遍历列表时获取下一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167868/