如何迭代地对循环列表进行切片? (Python 2.7)

How to slice a circular list iteratively ? (Python 2.7)

我在循环中对对象列表进行切片,但似乎无法使切片环绕该列表的末端,即使使用模索引也是如此:

N = 4
nums = range(N) # [0, 1, 2, 3]

for i in xrange(N):
    print nums[i: (i+2)%N]

打印:

[0, 1]
[1, 2]
[]
[]

我怎样才能做到这一点 returns:

[0, 1]
[1, 2]
[2, 3]
[3, 0]

注意:我使用的是 Python 2.7,无法导入像 numpy 这样的模块

要制作一对 "true" 循环数字,您应该合并一些 itertools:

from itertools import cycle, islice, izip

circ_list = izip(cycle(nums), islice(cycle(nums), 1, None))

这是一个无限迭代器,它将不断产生您想要的数字对类型。

cycle(nums) 将无休止地重复你的数字列表,islice(..., 1, None) 跳过它的第一项,所以你基本上有 [0, 1, 2, ...][1, 2, 3, ...],其中 izip结合。

例如,您现在可以切一小块:

>>> list(islice(circ_list, 5))
[(0, 1), (1, 2), (2, 3), (3, 0), (0, 1)]

或者你可以这样做:

N = 4
nums = range(N)

for i in xrange(N):
    print [nums[i], nums[(i+1)%N]]
[0, 1]
[1, 2]
[2, 3]
[3, 0]

或尝试使用:

N = 4
nums = xrange(N)

for i in xrange(N):
    print (nums[i:(i+2)%(i+N)] + [0] * 2)[:2]