Pythonic 循环列表

30 投票
7 回答
47459 浏览
提问于 2025-04-17 10:45

假设我有一个列表,

l = [1, 2, 3, 4, 5, 6, 7, 8]

我想找到一个任意元素的索引,以及它邻居的值。比如,

i = l.index(n)
j = l[i-1]
k = l[i+1]

但是,当 i == len(l) - 1 这种情况出现时,这个方法就不行了。所以我想把它包裹起来,

if i == len(l) - 1:
    k = l[0]
else:
    k = l[i+1]

有没有什么更优雅的方式来实现这个呢?

7 个回答

8

通常,我们想把一些数值调整到一个特定的范围时,可以使用 % 这个符号。它的作用就像是把数字“圈起来”,让它们在一个固定的范围内循环。

k = l[(i + 1) % len(l)]
33

将一个固定长度的列表循环使用,最简单的方法就是用%(取模)运算符。

list_element = my_list[idx % len(my_list)]

不过你可以看看这个链接:https://docs.python.org/library/itertools.html#itertools.cycle

from itertools import cycle

for p in cycle([1,2,3]):
  print "endless cycle:", p

另外要注意:这个工具可能需要占用比较多的额外存储空间(这取决于可迭代对象的长度)。

46

你可以使用取模运算符!

i = len(l) - 1
jIndex = (i - 1) % len(l)
kIndex = (i + 1) % len(l)

j = l[jIndex]
k = l[kIndex]

或者,简单点说:

k = l[(i + 1) % len(l)]

撰写回答