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

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

Я буду использовать пример для создания этого более конкретным...

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.

Какие-либо идеи?

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

39
задан martineau 21 September 2016 в 00:15
поделиться

2 ответа

>>> list(itertools.product(*arrays))
[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]

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

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

46
ответ дан 27 November 2019 в 02:26
поделиться
>>> arrays = [(-1,+1), (-2,+2), (-3,+3)]
>>> list(itertools.product(*arrays))
[(-1, -2, -3), (-1, -2, 3), (-1, 2, -3), (-1, 2, 3), (1, -2, -3), (1, -2, 3), (1, 2, -3), (1, 2, 3)]
37
ответ дан 27 November 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: