2008-12-01 27 views
7

Về cơ bản, tôi muốn xây dựng một danh sách hiểu về "sản phẩm Descartes" của hai vòng lặp. Hãy nghĩ về những Haskell code sau:Trong Python, có cách nào ngắn gọn để sử dụng khả năng đọc danh sách với nhiều trình lặp không?

[(i,j) | i <- [1,2], j <- [1..4]] 

trong đó sản lượng

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

Tôi có thể có được một hành vi tương tự bằng Python một cách ngắn gọn?

Trả lời

14

Bạn có hỏi về điều này không?

[ (i,j) for i in range(1,3) for j in range(1,5) ] 
+0

Vâng, tôi đã yêu cầu điều đó. Tôi không biết liệu nó có khả thi hay không và cú pháp nào để sử dụng, cảm ơn bạn. –

+0

Ngọt ngào! Tôi đã hoàn toàn bỏ lỡ tính năng này. –

2

Điều này dường như làm những gì bạn mô tả:

[[a, b] cho một trong phạm vi (1,3) cho b trong phạm vi (1,5)]

UPDATE: Drat! Nên tải lại trang để xem câu trả lời của S.Lott trước khi đăng. Hmmm ... phải làm gì cho một chút giá trị gia tăng? Có lẽ một lời khai ngắn cho tính hữu ích của chế độ tương tác với Python.

Tôi đến gần đây nhất từ ​​nền với Perl vì vậy với các vấn đề như thế này tôi thấy rất hữu ích khi nhập "python" ở dòng lệnh và thả vào chế độ tương tác và chỉ a) bắt đầu thử mọi thứ và b) tinh chỉnh niceties bằng cách nhấn mũi tên lên và điều chỉnh nỗ lực trước đó của tôi cho đến khi tôi nhận được những gì tôi muốn. Bất cứ lúc nào tôi đang mơ hồ về một số từ khóa, giúp đỡ là ở bàn tay. Chỉ cần gõ: help ("some_keyword"), đọc tóm tắt ngắn gọn, sau đó nhấn "Q" và tôi trở lại trực tuyến trong cuộc trò chuyện trực tiếp với trình thông dịch python.

Được đề xuất nếu bạn là người mới bắt đầu và không sử dụng.

7

Sản phẩm Descartes nằm trong số itertools module (trong 2.6).

>>> import itertools 
>>> list(itertools.product(range(1, 3), range(1, 5))) 
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3), (2, 4)] 
4

Thực tế thú vị về sự hiểu biết lồng nhau: nó bắt chước lồng nhau "cho" vòng lặp, vì vậy những cái bên trong có thể sử dụng giá trị từ bên ngoài. Điều này không hữu ích trong trường hợp sản phẩm Descartes, nhưng tốt để biết. Ví dụ:

[ (i,j) for i in range(10) for j in range(i) ] 

tạo tất cả các cặp (i,j) nơi 0>=i>j>10.

+0

Thú vị hơn nữa. Cảm ơn bạn! –

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