如何简化这些嵌套的for循环?

时间:2020-03-25 23:42:50

标签: python loops for-loop

我想简化此过程,以便可以控制有多少嵌套的for循环。本质上是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 :(得分:0)

您可以使用递归生成器函数轻松地做到这一点:

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

答案 1 :(得分:0)

是的,递归是你的朋友。

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)