0

Как применить itertools.product к элементам списка списков?

131

У меня есть список массивов, и я хочу получить декартово произведение элементов этих массивов.

Чтобы проиллюстрировать проблему, приведу пример...

itertools.product вроде как должен помочь, но я застрял на небольшом нюансе.

arrays = [(-1, +1), (-2, +2), (-3, +3)];

Если я сделаю следующее:

cp = list(itertools.product(arrays));

То я получаю:

cp = cp0 = [((-1, 1),), ((-2, 2),), ((-3, 3),)]

Но я хочу получить:

cp1 = [(-1, -2, -3), (-1, -2, +3), (-1, +2, -3), (-1, +2, +3), ..., (+1, +2, -3), (+1, +2, +3)].

Я пробовал несколько различных вариантов:

cp = list(itertools.product(itertools.islice(arrays, len(arrays))));
cp = list(itertools.product(iter(arrays, len(arrays))));

Все они вернули мне cp0 вместо cp1.

Есть идеи, как это исправить?

Заранее спасибо.

2 ответ(ов)

0

Ваш код должен передавать все пары в product как отдельные аргументы, чтобы получить их декартово произведение.

Проблема в вашем варианте заключается в том, что вы передаете в product только один аргумент. Запрашивая декартово произведение одного списка, вы получаете тривиальный случай, который возвращает список, содержащий только один элемент — сам переданный список.

0

Ваша задача заключается в получении всех возможных комбинаций из заданных массивов, где каждый элемент массива представлен кортежем значений, которые могут быть как положительными, так и отрицательными. Для этого вы можете использовать функцию itertools.product из модуля itertools.

Вот пример кода, который достигает этой цели:

import itertools

arrays = [(-1, +1), (-2, +2), (-3, +3)]
result = list(itertools.product(*arrays))
print(result)

В результате выполнения этого кода вы получите список всех возможных комбинаций для указанных массивов. Результат будет следующим:

[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]

Обратите внимание, что каждая комбинация включает один элемент из каждого кортежа, и они могут быть как положительными, так и отрицательными. Функция itertools.product позволяет удобно генерировать все возможные произведения указанных последовательностей.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь