Тщательно продумав это, я думаю, что это лучший способ. Он позволяет легко выйти в середину без использования 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)
и использовать ее.
Это также позволяет вам легко сойти с колеса обозрения в середине, вместо того, чтобы ждать, пока ковш снова не опустится на дно. Другие решения (включая ваше) требуют, чтобы вы отметили running
в середине цикла for
, а затем break
.