我有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
的所有组合。