动态地将嵌套列表提供给 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)

这样,无论给哪个维度,都可以实现poolsglobals的所有组合