【问题标题】:How can I simplify these nested for loops?如何简化这些嵌套的 for 循环?
【发布时间】:2020-07-06 14:22:24
【问题描述】:

我想让这个简化,这样我就可以控制有多少嵌套的 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 个字符串的列表

【问题讨论】:

  • 你到底想做什么?只需创建所有不同的方向排列?
  • 我想我明白你在问什么,如果你把它打开,我会回答你的问题。
  • 我没有关闭它
  • 哦,它已关闭,因为它与 stackoverflow.com/questions/48395838/… 相似
  • 是的,但它不是固定产品...我严重怀疑所附问题是否满足 OPs 问题。

标签: python loops for-loop


【解决方案1】:

你可以很容易地使用递归生成器函数来做到这一点:

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

【讨论】:

  • 谢谢,它有效。虽然 CreateDirectionList 基本上只是让它水平和垂直交替,但我可以弄清楚
  • 当然,只需将您的CreateValueList 作为工厂参数传递,生成器就可以工作了。我只评论它是因为我无法给出符合您期望的示例输出。
【解决方案2】:

是的,递归是你的朋友。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2012-06-23
    • 2018-09-16
    • 2017-01-06
    • 2020-01-14
    相关资源
    最近更新 更多