动态地将嵌套列表提供给 itertools
Dynamically giving nested lists to itertools
我有 6 个列表:pool_x, pool_y, pool_z, global_x, global_y, global_z
和一组 unique_points
。我正在使用 itertools
以某种方式制作这些列表的笛卡尔积:
for element in itertools.product(pool_x, pool_y, pool_z):
unique_points.add(element)
for element in itertools.product(global_x, pool_y, pool_z):
unique_points.add(element)
for element in itertools.product(pool_x, global_y, pool_z):
unique_points.add(element)
for element in itertools.product(pool_x, pool_y, global_z):
unique_points.add(element)
但如您所见,这是硬编码方式。上面的代码适用于 3 个维度。在 2 维中:我的列表只有 4 个,即 pool_x, pool_y, global_x, global_y
,代码变成这样:
for element in itertools.product(pool_x, pool_y):
unique_points.add(element)
for element in itertools.product(pool_x, global_y):
unique_points.add(element)
for element in itertools.product(global_x, pool_y):
unique_points.add(element)
问题 现在我想将这段代码缩放到任何维度。为此,到目前为止我已经实现的是制作嵌套列表:pools
(包括pool_x、pool_y、pool_z,具体取决于任何维度)和globals
(包括 global_x、global_y 等)。然后,可以通过以下方式实现第一个笛卡尔积(即在池之间):
for element in itertools.product(*pools):
unique_points.add(element)
但是如何像以前的代码为 2 维和 3 维所做的那样在池和全局变量之间生成所有笛卡尔积?如果新的动态代码为我们提供与上述硬编码代码相同的对,则可以验证正确性。或者也欢迎任何其他方式来做到这一点。
最后,我自己想出了答案。
for i in range(self.dimensions):
temp_pools = list(self.pools) # make new list of pools so that original pools stays untouched
temp_pools[i] = self.globals[i] # <= main thing
for element in itertools.product(*temp_pools):
self.unique_points.add(element)
这样,无论给哪个维度,都可以实现pools
和globals
的所有组合
我有 6 个列表:pool_x, pool_y, pool_z, global_x, global_y, global_z
和一组 unique_points
。我正在使用 itertools
以某种方式制作这些列表的笛卡尔积:
for element in itertools.product(pool_x, pool_y, pool_z):
unique_points.add(element)
for element in itertools.product(global_x, pool_y, pool_z):
unique_points.add(element)
for element in itertools.product(pool_x, global_y, pool_z):
unique_points.add(element)
for element in itertools.product(pool_x, pool_y, global_z):
unique_points.add(element)
但如您所见,这是硬编码方式。上面的代码适用于 3 个维度。在 2 维中:我的列表只有 4 个,即 pool_x, pool_y, global_x, global_y
,代码变成这样:
for element in itertools.product(pool_x, pool_y):
unique_points.add(element)
for element in itertools.product(pool_x, global_y):
unique_points.add(element)
for element in itertools.product(global_x, pool_y):
unique_points.add(element)
问题 现在我想将这段代码缩放到任何维度。为此,到目前为止我已经实现的是制作嵌套列表:pools
(包括pool_x、pool_y、pool_z,具体取决于任何维度)和globals
(包括 global_x、global_y 等)。然后,可以通过以下方式实现第一个笛卡尔积(即在池之间):
for element in itertools.product(*pools):
unique_points.add(element)
但是如何像以前的代码为 2 维和 3 维所做的那样在池和全局变量之间生成所有笛卡尔积?如果新的动态代码为我们提供与上述硬编码代码相同的对,则可以验证正确性。或者也欢迎任何其他方式来做到这一点。
最后,我自己想出了答案。
for i in range(self.dimensions):
temp_pools = list(self.pools) # make new list of pools so that original pools stays untouched
temp_pools[i] = self.globals[i] # <= main thing
for element in itertools.product(*temp_pools):
self.unique_points.add(element)
这样,无论给哪个维度,都可以实现pools
和globals
的所有组合