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
有更好的方法吗?
答案 0 :(得分:69)
仔细考虑后,我认为这是最好的方法。它可以让你轻松地在中间退出而不使用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
。
答案 1 :(得分:13)
while running:
for elem,next_elem in zip(li, li[1:]+[li[0]]):
...
答案 2 :(得分:7)
您可以使用成对循环迭代器:
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)):
...
答案 3 :(得分:5)
在Python中使用zip方法。此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素
while running:
for thiselem,nextelem in zip(li, li[1 : ] + li[ : 1]):
#Do whatever you want with thiselem and nextelem
答案 4 :(得分:3)
while running:
lenli = len(li)
for i, elem in enumerate(li):
thiselem = elem
nextelem = li[(i+1)%lenli]
答案 5 :(得分:3)
解决这个问题的另一种方法:
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]
答案 6 :(得分:0)
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)]
答案 7 :(得分:0)
while running:
lenli = len(li)
for i, elem in enumerate(li):
thiselem = elem
nextelem = li[(i+1)%lenli] # This line is vital
答案 8 :(得分:0)
我已经使用枚举来解决此问题。
storage = ''
for num, value in enumerate(result, start=0):
content = value
if 'A' == content:
storage = result[num + 1]
我在这里使用 num 作为 Index ,当它找到正确的值时,会将其加到实际列表的当前索引中。这使我可以下一个索引。
希望这对您有帮助。
答案 9 :(得分:0)
就这么简单
li = [0, 1, 2, 3]
while 1:
for i, item in enumerate(x):
k = i + 1 if i != len(x) - 1 else 0
print('Current index {} : {}'.format(i,li[k]))
答案 10 :(得分:0)
对于从1(或任何> 0)到结束的字符串列表。
adb kill-server
答案 11 :(得分:0)
简单的解决方案是通过合并以下条件来删除IndexError:
if(index<(len(li)-1))
由于不会到达最后一个索引,因此现在不会发生错误“索引超出范围”。这个想法是在迭代时访问下一个元素。到达倒数第二个元素时,您可以访问最后一个元素。
使用枚举方法将索引或计数器添加到可迭代对象(列表,元组等)。现在使用index + 1,我们可以在遍历列表的同时访问下一个元素。
li = [0, 1, 2, 3]
running = True
while running:
for index, elem in enumerate(li):
if(index<(len(li)-1)):
thiselem = elem
nextelem = li[index+1]
答案 12 :(得分:-6)
c = [ 1, 2, 3, 4 ]
i = int(raw_input(">"))
if i < 4:
print i + 1
else:
print -1