Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中循环时获取下一个元素_Python_List_Iteration_Next - Fatal编程技术网

Python 在列表中循环时获取下一个元素

Python 在列表中循环时获取下一个元素,python,list,iteration,next,Python,List,Iteration,Next,当到达最后一个元素时,将引发一个索引器(对于任何迭代的列表、元组、字典或字符串都是如此)。实际上,我希望在这一点上,nextelem等于li[0]。我对这件事相当麻烦的解决办法是 li = [0, 1, 2, 3] running = True while running: for elem in li: thiselem = elem nextelem = li[li.index(elem)+1] 有更好的方法吗?您可以使用成对循环迭代器: whil

当到达最后一个元素时,将引发一个
索引器
(对于任何迭代的列表、元组、字典或字符串都是如此)。实际上,我希望在这一点上,
nextelem
等于
li[0]
。我对这件事相当麻烦的解决办法是

li = [0, 1, 2, 3]

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

有更好的方法吗?

您可以使用成对循环迭代器:

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

仔细考虑后,我认为这是最好的办法。它可以让你轻松地在中间退出,而不使用<代码>破解<代码>,我认为这很重要,它需要最少的计算,所以我认为它是最快的。它也不要求
li
是列表或元组。它可以是任何迭代器

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)):
    ...

我把其他的解决方案留给子孙后代

所有那些花哨的迭代器都有它的位置,但不是在这里。使用%运算符

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)]
我认为这比涉及
tee
的其他解决方案更容易理解,而且可能更快。如果你确定列表的大小不会改变,你可以储存一份
len(li)
并使用它


<>这也可以让你轻松地在中间踩下费里斯轮,而不是等待桶再次下沉。其他解决方案(包括您的)需要检查<代码>运行< <代码> > <代码>循环,然后<代码>破解< /代码> .< /p> < p>一个不同的解决方法:

li = [0, 1, 2, 3]

running = True
idx = 0
while running:
    thiselem = li[idx]
    idx = (idx + 1) % len(li)
    nextelem = li[idx]
while running:
    lenli = len(li)
    for i, elem in enumerate(li):
        thiselem = elem
        nextelem = li[(i+1)%lenli]
li=[0,1,2,3]
对于范围内的i(len(li)):
如果i
在Python中使用zip方法。此函数返回元组列表,其中第i个元组包含每个参数序列或iterables中的第i个元素

   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]

我使用了枚举来处理这个问题

   while running:
        lenli = len(li)
        for i, elem in enumerate(li):
            thiselem = elem
            nextelem = li[(i+1)%lenli] # This line is vital
我在这里使用了num作为索引,当它找到正确的值时,它会将一个值与实际列表的当前索引相加。这让我可以移动到下一个索引

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

就这么简单:

storage = ''
for num, value in enumerate(result, start=0):
    content = value
    if 'A' == content:
        storage = result[num + 1]
对于字符串列表,从1(或任何大于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]))

简单的解决方案是通过合并以下条件来移除索引器:

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


<代码>(索引是我的第二个最爱,在我的之后。-)-简单是最好的,但是如果列表是大的,这就创建了两个副本。考虑省去while循环。这似乎与问题无关。如果它是相关的,考虑解释为什么。我想无限期地循环一个列表,因此while / for循环组合。对不起,没有解释。我想,你也可以,理想的是,能够在周期的中间停下来,而不是只在结束的时候。是的。我相信我可以用
break
来解决这个问题。这很好。它将while循环和for循环合并为一个简洁的循环,该循环在列表中的相邻对上不断迭代,并在末尾换行。+1用于使用pairwise-一个仅存在于itertools文档中的非官方库函数。因此,虽然您无法导入它,但它是可以工作的。我认为,隐藏在for循环中运行的测试并要求使用
break
不是一个好主意。+1是的,这也是简单有效的。对于具有极其简单的程序解决方案的问题,不需要这些不必要的复杂函数解决方案。Python不是函数式语言@马克·拜尔斯,谢谢!我确实认为,如果列表非常小,那么就有空间提供一个功能相当强大的解决方案,我补充说。运行
的整个位都是不起作用的,试图把它塞进一个功能解决方案是很难看的。@Mark Byers:在这里,我认为答案是最好使用itertools,但以一种非常简单的方式。我觉得它很快,很容易理解。我是一个完美主义者。令人恼火的是,经过8次编辑后,它变成了一个社区维基答案。我喜欢这个<代码>(idx+1)%len(li)
太棒了!注意,这是创建一个新列表;在处理庞大的列表时,这可能是您不想做的事情。您好,欢迎来到stackoverflow。请给出解释,而不仅仅是回答的代码出于某种原因,这是用最后一个元素再次打印列表的第一个元素。这是一个非常好的简洁解决方案。
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]))
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
if(index<(len(li)-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]