【问题标题】:Dynamically generating a flexible number of nested for loops [duplicate]动态生成灵活数量的嵌套for循环[重复]
【发布时间】:2018-09-22 22:18:12
【问题描述】:

是否可以根据输入的长度在函数中添加/减少嵌套 for 循环的数量?

例如: 基于长度为 3 的某个输入,我可能需要使用 1 个嵌套的 for 循环(另一个 for 循环内的 for 循环)。与此类似,

for i in range(0, len(input)+1):
    for j in range(i+1, len(input)+1):

但是,当输入长度为 4 时,如果我可以在已经存在的嵌套 for 循环中引入额外的 for 循环,我可以达到我的结果,这意味着,

for i in range(0, len(input)+1):
    for j in range(i+1, len(input)+1):
        for k in range(j+1, len(input)+1):`

同样,如果输入长度为5,那么我想再引入一个for循环,

for i in range(0, len(input)+1):
    for j in range(i+1, len(input)+1):
        for k in range(j+1, len(input)+1):
            for l in range(k+1, len(input)+1):`

模式是,对于长度为 n 的输入,会有 n-1 个 for 循环。

是否可以在 Python 中创建这样的函数?

【问题讨论】:

  • 听起来像是 XY 问题。您要解决的真正问题是什么?
  • 我们可以举个例子。如果应用得当,再循环适合这里。
  • 例如,我有一个数字/字母列表作为输入。 Input = [1,2,3,4] 我想创建所有单个元素的组合。与下面类似,[1],[2],[3],[4],[1,2],[1,3],[1,4],[2,3],[2,4], [3,4],[1,2,3],[1,2,4],[1,3,4],[2,3,4],[1,2,3,4] 也许,那里是解决实际问题的不同方法。但是在尝试解决这个问题时,我想出了嵌套 for 循环数量可变的问题。
  • 这不是一个好的骗子@RafaelC;这个问题是关于可变数量的 for 循环,而您链接的所谓的欺骗是关于生成组合。
  • @ReblochonMasque 好吧,让问题公开。但只会说明指向正确解决方案的链接:stackoverflow.com/questions/464864/…。构建可变数量的 for 循环是一个糟糕的设计

标签: python for-loop dynamic


【解决方案1】:

article 中,用 C 编写并匆忙翻译成 python 的代码为您提供:

如果我们看看嵌套循环是如何工作的,我们会发现最里面的 循环大部分时间都在工作,只有当我们 用完内部循环中的值。

要将其转换为动态嵌套循环,我们可以表示 数组中的不同循环变量。为简单起见,我们假设 这些变量的上限是一个常数,如上 例子。

要实现动态嵌套循环,我们需要增加最内层 循环变量,直到我们用完值。只有这样我们才需要看 改变上层循环变量。

虽然这个 sn-p 正在生成组合数学,但也许可以想象将它重新用于不同的目的。

正如 cmets 中提到的,它可能不是一个好的设计选择。
与增加间接级别相比,必须有一种更好(更pythonic)的方式使用生成器,或者可能是异步。

当然,还有递归,但这不是问题的重点。

生成动态嵌套循环

MAXROWS = 4      #    contains the number of levels
MAXVALUES = 2    #    contains the maximum combination for a given nested variables.

display = ['1', '2', '3', '4', '5', '6', '7', '8', '9']

arrs = [0] * MAXROWS   # represent the different variables in the for loops                      
status = False

while not status: 

    total = 0
    # calculate total for exit condition
    for r in range(MAXROWS):
        total += arrs[r]
        # test for exit condition
    if total == (MAXVALUES - 1) * MAXROWS:
        status = True

    # printing
    for r in range(MAXROWS):
        print(display[arrs[r]], end=' ')  # print(arrs[r])
    print()

    # increment loop variables
    change = True
    r = MAXROWS-1    # start from innermost loop

    while change and r >= 0:
    # increment the innermost variable and check if spill overs
        if (arrs[r] + 1) > MAXVALUES-1:    
            arrs[r] += 1
            arrs[r] = 0     #  // reintialize loop variable
            # Change the upper variable by one
            # We need to increment the immediate upper level loop by one
            change = True   
        else:
            arrs[r] += 1
            change = False   # Stop as there the upper levels of the loop are unaffected

            # We can perform any inner loop calculation here arrs[r]

        r -= 1  #  move to upper level of the loop

输出:

1 1 1 1 
1 1 1 2 
1 1 2 1 
1 1 2 2 
1 2 1 1 
1 2 1 2 
1 2 2 1 
1 2 2 2 
2 1 1 1 
2 1 1 2 
2 1 2 1 
2 1 2 2 
2 2 1 1 
2 2 1 2 
2 2 2 1 
2 2 2 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-04-22
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    相关资源
    最近更新 更多