小编典典

遍历列表时获取下一个元素

python

li = [0, 1, 2, 3]

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

当它到达最后一个元素时,将IndexError引发an
(对于任何迭代的列表,元组,字典或字符串都是这种情况)。实际上,我实际上希望在这一点nextelem上平等li[0]。我对此比较麻烦的解决方案是

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

有更好的方法吗?


阅读 337

收藏
2021-01-20

共1个答案

小编典典

经过仔细考虑之后,我认为这是最好的方法。它使您无需使用即可轻松过渡到中间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

2021-01-20