动态地将嵌套列表提供给itertools

问题描述 投票:-1回答:1

我有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维进行处理,使池和全局变量之间的所有笛卡尔积?如果新的动态代码给我们与上述硬编码给我们的对相同的对,则可以验证正确性。或欢迎使用其他任何方式。

python itertools cartesian-product
1个回答
0
投票

最后,我自己找出答案。

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

© www.soinside.com 2019 - 2024. All rights reserved.