Как я могу упростить эти вложенные циклы? - PullRequest
0 голосов
/ 26 марта 2020

Я бы хотел упростить это, чтобы контролировать количество вложенных циклов. По сути это будет 3

for d1 in ['left','right','up','down']:
    for d2 in CreateDirectionList(d1):
        for d3 in CreateDirectionList(d2):
            #Do something with list [d1, d2, d3]
return False

, а 4 будет

for d1 in ['left','right','up','down']:
    for d2 in CreateDirectionList(d1):
        for d3 in CreateDirectionList(d2):
            for d4 in CreateDirectionList(d3):
                #Do something with list [d1, d2, d3, d4]
return False

Я довольно новичок.

CreateDirectionList просто возвращает список с 2 строками на основе строкового ввода

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Да, рекурсия - твой друг.

def CreateDirectionList(d):
    if d == "left" or d == "right":
        return ['up','down']
    if d == "up" or d == "down":
        return ['left','right']

def nMoreSteps(d,n):
    if n == 0:
        return [[d]]
    else:
        results = []
        for k in CreateDirectionList(d):
            for k2 in nMoreSteps(k,n-1):
                results.append([d]+k2)
        return results

def nSteps(n):
    results = []
    for d1 in ['left','right','up','down']:
        results += nMoreSteps(d1,n-1)
    return(results)

for k in nSteps(4):
    print(k)
0 голосов
/ 26 марта 2020

Вы можете довольно легко сделать это с помощью функции рекурсивного генератора:

def gen(values, value_list_factory, depth):
    if depth == 0: # base case
        yield ()
        return

    for x in values:
        for rest in gen(value_list_factory(x), value_list_factory, depth-1):  # recurse!
            yield x, *rest

Вы не указали, как работает ваша CreateDirectionList функция, поэтому вот пример моего генератора, работающего с фабричной функцией, которая удаляет переданное значение из начальной последовательности ['left','right','up','down'] (это означает, что вы никогда не получите одно и то же значение дважды в строке).

directions = ['left','right','up','down']

def create(dir):
    return [x for x in directions if x != dir]

for d1, d2, d3 in gen(directions, create, 3):
    print(d1, d2, d3)

Вывод:

left right left
left right up
left right down
left up left
left up right
left up down
left down left
left down right
left down up
right left right
right left up
right left down
right up left
right up right
right up down
right down left
right down right
right down up
up left right
up left up
up left down
up right left
up right up
up right down
up down left
up down right
up down up
down left right
down left up
down left down
down right left
down right up
down right down
down up left
down up right
down up down
...