有条件地使用嵌套 for 循环的一部分
Conditionally use parts of a nested for loop
我广泛搜索了这个答案,但似乎找不到答案。因此,我第一次在这里发帖提问。
我有一个使用许多参数来执行计算的函数。根据用户输入,我想遍历某些(或所有)参数的可能值。如果我想遍历所有参数,我可能会这样做:
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)
如果我只想迭代第一个和第四个参数,我可能会这样做:
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 个不同的代码块。
我可以这样做:
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)
我只是想知道有没有更好的方法。也许使用 filter()、map() 或列表理解...(我还没有足够清楚的理解)
如评论中所建议,您可以构建一个参数数组,然后使用数组中的每个值调用该函数。构建数组的最简单方法是对定义每个参数范围的列表使用递归。在这段代码中,我假定了一个由 start
、stop
和 scale
参数组成的元组列表(例如,列表中的第三个元素生成 [3, 2.8, 2.6, 2.4, 2.2]
)。要使用静态值,您可以使用元组 (static, static+1, 1)
.
def build_param_array(ranges):
r = ranges[0]
if len(ranges) == 1:
return [[p * r[2]] for p in range(r[0], r[1], -1 if r[1] < r[0] else 1)]
res = []
for p in range(r[0], r[1], -1 if r[1] < r[0] else 1):
pa = build_param_array(ranges[1:])
for a in pa:
res.append([p * r[2]] + a)
return res
# range = (start, stop, scale)
ranges = [(1, 5, 1),
(0, 10, .1),
(15, 10, .2)
]
params = build_param_array(ranges)
for p in params:
doFunction(*p)
我广泛搜索了这个答案,但似乎找不到答案。因此,我第一次在这里发帖提问。
我有一个使用许多参数来执行计算的函数。根据用户输入,我想遍历某些(或所有)参数的可能值。如果我想遍历所有参数,我可能会这样做:
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)
如果我只想迭代第一个和第四个参数,我可能会这样做:
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 个不同的代码块。
我可以这样做:
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)
我只是想知道有没有更好的方法。也许使用 filter()、map() 或列表理解...(我还没有足够清楚的理解)
如评论中所建议,您可以构建一个参数数组,然后使用数组中的每个值调用该函数。构建数组的最简单方法是对定义每个参数范围的列表使用递归。在这段代码中,我假定了一个由 start
、stop
和 scale
参数组成的元组列表(例如,列表中的第三个元素生成 [3, 2.8, 2.6, 2.4, 2.2]
)。要使用静态值,您可以使用元组 (static, static+1, 1)
.
def build_param_array(ranges):
r = ranges[0]
if len(ranges) == 1:
return [[p * r[2]] for p in range(r[0], r[1], -1 if r[1] < r[0] else 1)]
res = []
for p in range(r[0], r[1], -1 if r[1] < r[0] else 1):
pa = build_param_array(ranges[1:])
for a in pa:
res.append([p * r[2]] + a)
return res
# range = (start, stop, scale)
ranges = [(1, 5, 1),
(0, 10, .1),
(15, 10, .2)
]
params = build_param_array(ranges)
for p in params:
doFunction(*p)