如何迭代地对循环列表进行切片? (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]
我在循环中对对象列表进行切片,但似乎无法使切片环绕该列表的末端,即使使用模索引也是如此:
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]