您是否可以从第n个元素开始完全循环一个范围?

时间:2018-12-09 20:49:38

标签: python discrete-mathematics

我想知道是否存在一个基本的解决方案来做这样的事情:

for n in range(length=8, start_position= 3, direction= forward)

我遇到的问题是我希望循环继续通过最终索引,并在idx = 0处再次拾取,然后在idx = 1处依此类推,然后在idx = 3处停止,即start_position。

为给出具体背景,我寻求n皇后问题的所有可能的完整解决方案。

5 个答案:

答案 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]