Получение следующего элемента при циклическом перемещении по списку

li = [0, 1, 2, 3] running = True while running: for elem in li: thiselem = elem nextelem = li[li.index(elem)+1] 

Когда это достигает последнего элемента, IndexError значение IndexError (как в случае любого списка, кортежа, словаря или строки, которая повторяется). В действительности я хочу, чтобы nextelem равнялся li[0] . Мое довольно громоздкое решение для этого было

 while running: for elem in li: thiselem = elem nextelem = li[li.index(elem)-len(li)+1] # negative index 

Есть ли лучший способ сделать это?

8 Solutions collect form web for “Получение следующего элемента при циклическом перемещении по списку”

Подумав об этом осторожно, я думаю, что это лучший способ. Он позволяет вам легко уйти в середине без использования 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 .

 while running: for elem,next_elem in zip(li, li[1:]+[li[0]]): ... 

Вы можете использовать парный циклический итератор:

 from itertools import izip, cycle, tee def pairwise(seq): a, b = tee(seq) next(b) return izip(a, b) for elem, next_elem in pairwise(cycle(li)): ... 
 while running: lenli = len(li) for i, elem in enumerate(li): thiselem = elem nextelem = li[(i+1)%lenli] 

Используйте метод zip в Python. Эта функция возвращает список кортежей, где i-й кортеж содержит i-й элемент из каждой из последовательностей аргументов или итераций

  while running: for thiselem,nextelem in zip(li, li[1 : ] + li[ : 1]): #Do whatever you want with thiselem and nextelem 

Совсем другой способ решить эту проблему:

  li = [0,1,2,3] for i in range(len(li)): if i < len(li)-1: # until end is reached print 'this', li[i] print 'next', li[i+1] else: # end print 'this', li[i] 
  li = [0, 1, 2, 3] for elem in li: if (li.index(elem))+1 != len(li): thiselem = elem nextelem = li[li.index(elem)+1] print 'thiselem',thiselem print 'nextel',nextelem else: print 'thiselem',li[li.index(elem)] print 'nextel',li[li.index(elem)] 
 c = [ 1, 2, 3, 4 ] i = int(raw_input(">")) if i < 4: print i + 1 else: print -1 
 
Interesting Posts for Van-Lav

Python: ctypes хеширует замену массива c_char без отключения над '\ 0' байтами

Печатать текст перед вызовом input () в python

Сумма диагональных элементов в матрице

Получение данных полевого графика – Matplotlib

Python RE (слово для проверки первой буквы чувствительно к регистру и остальное нечувствительно к регистру)

Pandas Тип категориальных данных не ведет себя так, как ожидалось

питон. как получить значение атрибута с помощью libxml2

исполнение len (List) против чтения переменной

Добавить индексированный столбец в DataFrame с помощью pandas

scipy не оптимизирует и возвращает «Желаемая ошибка не всегда достигается из-за потери точности»

Ограничения с плавающей запятой

Ошибка при извлечении данных из Yahoo Finance

Javascript эквивалент Zip-функции Python

как я могу использовать данные, отправленные из ajax в колбе?

Точная репликация текстовой предварительной обработки текста в python

Python - лучший язык программирования в мире.