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

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

Index 2D numpy массив двумерным массивом индексов без циклов

Объект карты Python не подлежит расшифровке

pickle error assert id (obj) не в self.memo

как создать словарь, используя два списка в python?

OS X не использует самую последнюю версию NumPY

Как подсчитать частоты слов в файле в python

Установить точку останова отладчика в конце функции без возврата

Как создать счетчики терминов в одном столбце и отменить подсчеты как дополнительные coulmns в кадре данных pandas

Просмотр изображения dicom с помощью Bokeh

Stacking star PSF из изображения; выравнивание субпиксельных центров

Как разобрать строку, представляющую вложенный список, в фактический список?

Как настроить простой HTTP-сервер в Python 3.5 на Windows 10?

Что делает форматирование символа% c в Python и его использование?

Создание динамических очередей с помощью Сельдерея

Отправка команд DDC / CI для мониторинга в Windows с использованием Python?

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