Можете ли вы за цикл полностью через диапазон, но начиная с n-го элемента? - PullRequest
0 голосов
/ 09 декабря 2018

Я хотел бы знать, существует ли базовое решение для выполнения чего-то подобного:

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

Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы, чтобы цикл продолжился после последнего индекса, и выбралснова при idx = 0, затем idx = 1 и т. д. и остановка при idx = 3, start_position.

Чтобы дать контекст, я ищу все возможные полные решения проблемы n-queen.

Ответы [ 5 ]

0 голосов
/ 09 декабря 2018
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]
0 голосов
/ 09 декабря 2018

Вы можете реализовать это для произвольной итерации, используя 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]
0 голосов
/ 09 декабря 2018

На основании вашего последнего редактирования вам нужен "нормальный" диапазон и оператор по модулю:

for i in range(START, START + LEN): 
    do_something_with(i % LEN)
0 голосов
/ 09 декабря 2018

Другим вариантом решения этой проблемы является использование модульной арифметики.Вы можете сделать что-то вроде этого, например:

for i in range(8)
   idx = (i + 3) % 8
   # use idx

Это легко обобщить для работы с различными длинами и смещениями.

0 голосов
/ 09 декабря 2018
from itertools import chain

for n in chain(range(3,8), range(3)):
    ...

chain() возвращает итератор с 3, 4, ..., 7, 0, 1, 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...