2010-06-13 90 views
28

Tôi có một danh sách các mảng và tôi muốn lấy sản phẩm Descartes của các phần tử trong mảng.Làm cách nào để áp dụng itertools.product cho các phần tử của danh sách danh sách?

tôi sẽ sử dụng một ví dụ để làm cho cụ thể hơn này ...

itertools.product dường như làm các trick nhưng tôi bị mắc kẹt trong một chi tiết nhỏ.

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

Nếu tôi làm

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

tôi nhận được

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

Nhưng những gì tôi muốn nhận được là

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

Tôi đã thử một vài điều khác nhau:

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

Tất cả đều cho tôi cp0 thay vì cp1.

Bất kỳ ý tưởng nào?

Xin cảm ơn trước.

+0

Bạn đã có câu trả lời dưới đây, nhưng điều này có một số trường hợp sử dụng tốt cho các chức năng itertools sản phẩm: https://www.hackerrank.com/challenges/itertools-product – Afflatus

Trả lời

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

này sẽ ăn tất cả các cặp như các đối số riêng biệt để product, sau đó sẽ cung cấp cho bạn các sản phẩm Descartes trong số họ.

Lý do phiên bản của bạn không hoạt động là bạn đang cung cấp product chỉ một đối số. Yêu cầu cho một sản phẩm Descartes của một danh sách là một trường hợp tầm thường, và trả về một danh sách chỉ chứa một phần tử (danh sách được đưa ra làm đối số).

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

không có một tiền tố Asterix một mảng có ý nghĩa đặc biệt trong python hoặc là điều này chỉ là một cái gì đó cụ thể để itertools.product? – Ominus

+3

Xem http://stackoverflow.com/q/5239856/395857 và [Unpacking Argument Lists] (https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists). –

Các vấn đề liên quan