2010-06-13 3 views
28

배열 목록이 있는데 배열 요소의 데카르트 곱을 얻고 싶습니다.목록 목록의 요소에 itertools.product를 적용하는 방법은 무엇입니까?

나는이보다 구체적를 만들기 위해 예를 사용합니다은 ...

itertools.product 트릭을 할 것 같다하지만 난 조금 구체적으로 붙어있다.

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

나는

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(arrays)); 

할 경우

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

그들은 모두 나에게 CP0 대신 CP1했다.

아이디어가 있으십니까?

미리 감사드립니다.

+0

이미 아래의 답변을 가지고 있지만, 이것은 itertools 제품 기능에 대한 좋은 사용 사례가 있습니다 https://www.hackerrank.com/challenges/itertools-product – Afflatus

답변

36
>>> 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에 하나의 인수 만 제공한다는 것입니다. 하나의 목록의 데카르트 곱을 요구하는 것은 간단한 경우이며 하나의 요소 (인수로 주어진 목록) 만 포함하는 목록을 반환합니다.

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

은 배열이 별표 접두사를 가진 않습니다 파이썬에서의 특별한 의미인가 아니면 itertools.product에 특정한 무엇인가? – Ominus

+3

http://stackoverflow.com/q/5239856/395857 및 [인수 목록 열기 (Unpacking Argument Lists)] (https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists)를 참조하십시오. –