Jak stosować itertools.produkt do elementów listy list?

Mam listę tablic i chciałbym uzyskać iloczyn kartezjański elementów w tablicach.

Użyję przykładu, aby uczynić to bardziej konkretnym...

Itertools.produkt wydaje się działać, ale utknąłem w małym szczególe.

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

If I do

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

I get

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

But what I want to get is

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

Próbowałem kilku różnych rzeczy:

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

Wszyscy dali mi cp0 zamiast cp1 .

Jakieś pomysły? Z góry dzięki.
Author: martineau, 2010-06-14

2 answers

>>> 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)]

To przekaże wszystkie pary jako oddzielne argumenty product, które następnie otrzymają iloczyn kartezjański z nich.

Powodem, dla którego Twoja wersja nie działa, jest to, że podajesz product tylko jeden argument. Zapytanie o iloczyn kartezjański jednej listy jest banalnym przypadkiem i zwraca listę zawierającą tylko jeden element (listę podaną jako argument).

 39
Author: interjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-13 21:44:57
>>> 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)]
 35
Author: rkhayrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-13 21:41:14