Python 3.x 有条件地使用嵌套for循环的部分

Python 3.x 有条件地使用嵌套for循环的部分,python-3.x,loops,for-loop,filter,list-comprehension,Python 3.x,Loops,For Loop,Filter,List Comprehension,我已经广泛地搜索了这个答案,但似乎找不到答案。因此,我第一次在这里提出一个问题 我有一个函数,它使用许多参数来执行计算。根据用户输入,我想迭代一些(或全部)参数的可能值。如果我想遍历所有参数,我可能会这样做: for i in range(low1,high1): for j in range(low2,high2): for k in range(low3,high3): for m in range(low4,high4):

我已经广泛地搜索了这个答案,但似乎找不到答案。因此,我第一次在这里提出一个问题

我有一个函数,它使用许多参数来执行计算。根据用户输入,我想迭代一些(或全部)参数的可能值。如果我想遍历所有参数,我可能会这样做:

for i in range(low1,high1):
    for j in range(low2,high2):
        for k in range(low3,high3):
            for m in range(low4,high4):
                doFunction(i, j, k, m)
if use_static_j == True:
    low2  = -999
    high2 = -1000
for i in range(low1,high1):
    for j in range(low2,high2):
        for k in range(low3,high3):
            for m in range(low4,high4):
                j1 = j if use_static_j==False else user_input_j
                doFunction(i, j1, k, m)
如果我只想迭代第1个和第4个参数,我可以这样做:

for i in range(low1,high1):
    for m in range(low4,high4):
        doFunction(i, user_input_j, user_input_k, m)
我的实际代码几乎有15个嵌套for循环,其中包含15个不同的参数,每个参数都可能是可编辑的(或不可编辑的)。因此,对于我来说,使用我所拥有的并为参数的每个组合编写一个唯一的for循环块是不可伸缩的。如果我这样做,我将有2^15个不同的代码块

我可以这样做:

for i in range(low1,high1):
    for j in range(low2,high2):
        for k in range(low3,high3):
            for m in range(low4,high4):
                doFunction(i, j, k, m)
if use_static_j == True:
    low2  = -999
    high2 = -1000
for i in range(low1,high1):
    for j in range(low2,high2):
        for k in range(low3,high3):
            for m in range(low4,high4):
                j1 = j if use_static_j==False else user_input_j
                doFunction(i, j1, k, m)

我只是想知道有没有更好的办法。可能正在使用筛选器()、映射()或列表理解。。。(对此我还没有足够清楚的理解)

正如评论中所建议的,您可以构建一个参数数组,然后使用数组中的每个值调用函数。构建数组的最简单方法是在定义每个参数范围的列表上使用递归。在这段代码中,我假设元组列表由
开始
停止
缩放
参数组成(例如,列表中的第三个元素生成
[3,2.8,2.6,2.4,2.2]
)。要使用静态值,可以使用元组
(static,static+1,1)

def build_param_数组(范围):
r=范围[0]
如果len(范围)==1:
为范围(r[0],r[1]中的p返回[[p*r[2]],如果r[1]
正如注释中所建议的,您可以构建一个参数数组,然后使用数组中的每个值调用函数。构建数组的最简单方法是在定义每个参数范围的列表上使用递归。在这段代码中,我假设元组列表由
开始
停止
缩放
参数组成(例如,列表中的第三个元素生成
[3,2.8,2.6,2.4,2.2]
)。要使用静态值,可以使用元组
(static,static+1,1)

def build_param_数组(范围):
r=范围[0]
如果len(范围)==1:
为范围(r[0],r[1]中的p返回[[p*r[2]],如果r[1]
遗憾的是,我无法真正帮助您,但我想与您分享我过去使用过的一种方法。如果必须有条件地使用循环,可以尝试通过将选项映射到从所有选项构建的笛卡尔数组中的索引来构建仅使用单个循环的结构。因此,如果选项a在0-9范围内,选项b在0-4范围内,你可以迭代0-49,将选项a设置为迭代/5,将选项b设置为迭代%5。我曾想过这样做,但很难考虑使用15个不同的参数。此外,范围可能是负数,我实际上可能有额外的输入来指定范围的“步骤”。例如,-90到90度,步长为.1…
param=param_min+(索引%(乘以“内环”参数范围))*step_size
参数范围为
(param_max-param_min)/step size
,否?我发现这个问题似乎是朝着同样的方向发展的,这可能是一个最好用递归来解决的问题。遗憾的是,我真的不能帮助你,但是我想分享一个我过去使用过的方法。如果必须有条件地使用循环,可以尝试通过将选项映射到从所有选项构建的笛卡尔数组中的索引来构建仅使用单个循环的结构。因此,如果选项a在0-9范围内,选项b在0-4范围内,你可以迭代0-49,将选项a设置为迭代/5,将选项b设置为迭代%5。我曾想过这样做,但很难考虑使用15个不同的参数。此外,范围可能是负数,我实际上可能有额外的输入来指定范围的“步骤”。例如,-90到90度,步长为.1…
param=param_min+(索引%(乘以“内环”参数范围))*step_size
参数范围为
(param_max-param_min)/step size
,否?我发现这个问题似乎是朝着同样的方向发展的,这可能是一个最好通过递归解决的问题。这确实有效。但现在我有了一个新问题。使用此方法,如果启用所有选项,程序将以内存错误终止。如果我没有启用所有选项,我将把这个问题作为一个单独的问题来处理,因为你的答案是有效的。@DavidSteele是的,这就是问题所在,如果你有大量选项,你最终会生成一个相当大的数组。解决这一问题的一种方法是嵌套此代码的多个循环,例如,将选项集拆分为4组,并为每个选项构建参数数组,然后只需要4个嵌套的for循环即可处理16个选项。再次感谢Nick。我现在正在用它做实验——还有其他的