Python 中的参数化嵌套循环



我的模型中的一个参数控制数组的维度;它可以从1到任何正整数变化:就我而言,这可以达到20。
程序的流程经过许多依赖于此维度的循环。

例如,如果参数的值是 1,我将拥有:

for i1 in range(0,100,1):
do stuff

如果参数的值是 2,那么我会有这样的内容:

for i1 in range (0,100,1):
for i2 in range (0,100,1):
do stuff 

或者,如果参数的值为 3,我将拥有:

for i1 in range (0,100,1):
for i2 in range (0,100,1):
for i3 in range (0,100,1):
do stuff

维度可以改变,所以不可能提前指定需要多少个嵌套循环;这必须以某种参数化的方式编写。

由于您在中间循环中没有列出任何处理 - 仅在最内部循环中列出,因此我觉得您真正需要的是索引序列的迭代器:

max_dim成为你空间的维度,维度的数量。

max_val = 100
one_dim = list(range(max_val))
all_dim = [one_dim] * max_val

all_dim现在是一个列表列表,每个维度一个。 每个列表都包含值 0-99,即嵌套循环正在使用的值。 现在来看itertools的神奇步骤:

from itertools import product
for index_list in product(*all_dim):
# do your stuff; the index_list is [i1, i2, i3, ...]

这将遍历所需的维度。 举个小例子,下面是只有两个值和三个维度的product序列的外观:

>>> all_dim = [[0,1]] * 3
>>> all_dim
[[0, 1], [0, 1], [0, 1]]
>>> list(product(*all_dim))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

这能很好地处理你的问题吗?

对可变深度嵌套循环使用递归。

def nested(parameters, depth):
for x in range(0,100,1):
if depth==0:
do
else:
nested(parameters, depth-1)

最新更新