Динамическая передача вложенных списков в itertools - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть 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 et c.). Затем можно получить первый декартовый продукт (который находится между пулами):

        for element in itertools.product(*pools):
            unique_points.add(element)

Но как сделать все декартовы произведения между пулами и глобальными переменными так же, как предыдущий код делает для 2 Dimension и 3 Размер? Корректность может быть подтверждена, если новый динамический код c дает нам те же пары, что и код, указанный выше. ИЛИ любой другой способ сделать это также приветствуется.

1 Ответ

0 голосов
/ 14 апреля 2020

Наконец, я разобрался с ответом сам.

        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 могут быть достигнуты независимо от того, какое измерение дано.

...