我想知道是否存在一个基本的解决方案来做这样的事情:
for n in range(length=8, start_position= 3, direction= forward)
我遇到的问题是我希望循环继续通过最终索引,并在idx = 0处再次拾取,然后在idx = 1处依此类推,然后在idx = 3处停止,即start_position。
为给出具体背景,我寻求n皇后问题的所有可能的完整解决方案。
答案 0 :(得分:5)
根据您的最新修改,您需要一个“正常”范围和取模运算符:
for i in range(START, START + LEN):
do_something_with(i % LEN)
答案 1 :(得分:3)
from itertools import chain
for n in chain(range(3,8), range(3)):
...
chain()
返回带有3, 4, ..., 7, 0, 1, 2
的迭代器
答案 2 :(得分:1)
解决此问题的另一种方法是使用模块化算法。您可以这样做,例如:
for i in range(8)
idx = (i + 3) % 8
# use idx
可以很容易地将其推广到不同的长度和偏移量。
答案 3 :(得分:0)
您可以使用itertools.cycle
来实现任意迭代。
from itertools import cycle
def circular_iterator(iterable, skip=0, length=None, reverse=False):
"""Produces a full cycle of @iterable@, skipping the first @skip@ elements
then tacking them on to the end.
if @iterable@ does not implement @__len__@, you must provide @length@
"""
if reverse:
iterable = reversed(iterable)
cyc_iter = cycle(iterable)
for _ in range(skip):
next(cyc_iter, None)
if length:
total_length = length
else:
total_length = len(iterable)
for _ in range(total_length):
yield next(cyc_iter, None)
>>> lst = [x for x in range(1, 9)]
# [1, 2, 3, 4, 5, 6, 7, 8]
>>> list(circular_iterator(lst, skip=3))
[4, 5, 6, 7, 8, 1, 2, 3]
答案 4 :(得分:0)
def loop_around_range(length, start_position, direction='forward'):
looped_range = [k % length for k in range(start_position, start_position+length)]
if direction == 'forward':
return looped_range
else:
return looped_range[::-1]