循环列表时获取下一个元素
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
有更好的方法吗?
li = [0, 1, 2, 3]
running = True
while running:
for elem in li:
thiselem = elem
nextelem = li[li.index(elem)+1]
When this reaches the last element, an IndexError
is raised (as is the case for any list, tuple, dictionary, or string that is iterated). I actually want at that point for nextelem
to equal li[0]
. My rather cumbersome solution to this was
while running:
for elem in li:
thiselem = elem
nextelem = li[li.index(elem)-len(li)+1] # negative index
Is there a better way of doing this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
仔细想了想,我觉得这是最好的办法。它可以让你在不使用
break
的情况下轻松地从中间退出,我认为这很重要,并且它需要最少的计算,所以我认为它是最快的。它也不要求 li 是列表或元组。它可以是任何迭代器。我将其他解决方案留在这里供后代使用。
所有那些奇特的迭代器东西都有它的用武之地,但不在这里。使用 % 运算符。
现在,如果您打算无限循环遍历列表,那么只需这样做:
我认为这比涉及
tee
的其他解决方案更容易理解,而且可能也更快。如果您确定列表的大小不会改变,您可以保存 len(li) 的副本并使用它。这也让你可以轻松地从中间走下摩天轮,而不必等待水桶再次落到底部。其他解决方案(包括您的解决方案)要求您在
for
循环中间检查running
,然后检查break
。After thinking this through carefully, I think this is the best way. It lets you step off in the middle easily without using
break
, which I think is important, and it requires minimal computation, so I think it's the fastest. It also doesn't require thatli
be a list or tuple. It could be any iterator.I'm leaving the other solutions here for posterity.
All of that fancy iterator stuff has its place, but not here. Use the % operator.
Now, if you intend to infinitely cycle through a list, then just do this:
I think that's easier to understand than the other solution involving
tee
, and probably faster too. If you're sure the list won't change size, you can squirrel away a copy oflen(li)
and use that.This also lets you easily step off the ferris wheel in the middle instead of having to wait for the bucket to come down to the bottom again. The other solutions (including yours) require you check
running
in the middle of thefor
loop and thenbreak
.您可以使用成对循环迭代器:
You can use a pairwise cyclic iterator:
解决这个问题的一种相当不同的方法:
A rather different way to solve this:
使用 Python 中的 zip 方法。该函数返回一个元组列表,其中第 i 个元组包含每个参数序列或可迭代对象中的第 i 个元素
Use the zip method in Python. This function returns a list of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables
就这么简单:
As simple as this:
简单的解决方案是通过合并以下条件来删除 IndexError:
由于无法到达最后一个索引,因此现在不会发生错误“索引超出范围”。这个想法是在迭代时访问下一个元素。到达倒数第二个元素后,您可以访问最后一个元素。
使用枚举方法向可迭代对象(列表、元组等)添加索引或计数器。现在使用索引+1,我们可以在迭代列表时访问下一个元素。
The simple solution is to remove IndexError by incorporating the condition:
The error 'index out of range' will not occur now as the last index will not be reached. The idea is to access the next element while iterating. On reaching the penultimate element, you can access the last element.
Use enumerate method to add index or counter to an iterable(list, tuple, etc.). Now using the index+1, we can access the next element while iterating through the list.
我使用枚举来处理这个问题。
我在这里使用 num 作为索引,当它找到正确的值时,它会将实际列表的当前索引加一。这使我能够转向下一个索引。
我希望这对您的目的有所帮助。
I've used enumeration to handle this problem.
I've used num as Index here, when it finds the correct value it adds up one to the current index of actual list. Which allows me to maneuver to the next index.
I hope this helps your purpose.
对于字符串列表,从 1(或任何> 0)直到结束。
For strings list from 1(or whatever > 0) until end.