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

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

提问人:solub 提问时间:1/22/2020 更新时间:1/22/2020 访问量:538

问:

我正在循环中切片对象列表,但即使使用模索引,似乎也无法使切片环绕该列表的末尾:

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

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

指纹:

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

我怎样才能让它返回:

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

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

python-2.7 切片

评论

0赞 deceze 1/22/2020
从该列表返回的唯一切片表示法需要 step 参数:...[3, 0]nums[3::-3]

答:

2赞 deceze 1/22/2020 #1

要制作一对“真正的”圆形数字,您应该合并一些迭代工具

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)]

评论

0赞 solub 1/23/2020
谢谢。到目前为止,这是正确解决切片部分的唯一答案。
0赞 Clément 1/22/2020 #2

或者你可以做:

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]
0赞 U13-Forward 1/22/2020 #3

或者尝试使用:

N = 4
nums = xrange(N)

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