63
li = [0, 1, 2, 3]

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

当它到达最后一个元素时,IndexError会引发 an(对于任何迭代的列表、元组、字典或字符串都是如此)。那时我实际上想要 for nextelemto equal li[0]。我对此相当麻烦的解决方案是

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

有没有更好的方法来做到这一点?

4

12 回答 12

102

仔细考虑后,我认为这是最好的方法。它可以让你在不使用的情况下轻松进入中间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)并使用它。

这也让您可以轻松地从中间的摩天轮上下来,而不必等待水桶再次落到底部。其他解决方案(包括您的)要求您runningfor循环中间检查,然后break.

于 2010-01-30T13:17:33.567 回答
19
while running:
    for elem,next_elem in zip(li, li[1:]+[li[0]]):
        ...
于 2010-01-30T12:35:59.840 回答
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)):
    ...
于 2010-01-30T12:37:28.213 回答
6
while running:
    lenli = len(li)
    for i, elem in enumerate(li):
        thiselem = elem
        nextelem = li[(i+1)%lenli]
于 2010-01-30T13:22:19.837 回答
6

在 Python 中使用 zip 方法。此函数返回一个元组列表,其中第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素

    while running:
        for thiselem,nextelem in zip(li, li[1 : ] + li[ : 1]):
            #Do whatever you want with thiselem and nextelem         
于 2015-05-13T06:04:19.947 回答
5

解决此问题的一种完全不同的方法:

   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]
于 2014-07-15T07:30:33.300 回答
1

简单的解决方案是通过合并条件来删除 IndexError:

if(index<(len(li)-1))

现在不会出现错误“索引超出范围”,因为不会到达最后一个索引。这个想法是在迭代时访问下一个元素。到达倒数第二个元素时,您可以访问最后一个元素。

使用 enumerate 方法将索引或计数器添加到可迭代(列表、元组等)。现在使用 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]
于 2020-11-13T09:30:46.307 回答
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)]
于 2016-09-06T10:57:03.037 回答
0
   while running:
        lenli = len(li)
        for i, elem in enumerate(li):
            thiselem = elem
            nextelem = li[(i+1)%lenli] # This line is vital
于 2020-05-24T15:02:16.860 回答
0

我用枚举来处理这个问题。

storage = ''
for num, value in enumerate(result, start=0):
    content = value
    if 'A' == content:
        storage = result[num + 1]

我在这里使用num作为索引,当它找到正确的值时,它会将实际列表的当前索引加一。这使我可以操纵到下一个索引。

我希望这有助于你的目的。

于 2020-08-24T13:48:50.003 回答
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]))
于 2020-09-21T15:57:37.507 回答
0

对于从 1(或任何 > 0)到结束的字符串列表。

itens = ['car', 'house', 'moon', 'sun']

v = 0
for item in itens:
    b = itens[1 + v]
    print(b)
    print('any other command')
    if b == itens[-1]:
        print('End')
        break
    v += 1
于 2020-10-05T00:23:33.640 回答