2012-12-14 27 views
23

Tôi thường thấy mình làm điều này:Python lồng looping Idiom

for x in range(x_size): 
    for y in range(y_size): 
     for z in range(z_size): 
      pass # do something here 

Có cách nào ngắn gọn hơn để làm điều này bằng Python? Tôi đang nghĩ đến một cái gì đó dọc theo dòng của

for x, z, y in ... ? : 

Trả lời

38

Bạn có thể sử dụng itertools.product:

>>> for x,y,z in itertools.product(range(2), range(2), range(3)): 
...  print x,y,z 
... 
0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 1 2 
1 0 0 
1 0 1 
1 0 2 
1 1 0 
1 1 1 
1 1 2 
+0

Cảm ơn bạn. Tôi đã kết thúc lên một con đường khác nhau như tôi không thể sử dụng itertools, nhưng, sau khi xem xét tài liệu cho itertools, đó là chính xác những gì tôi cần. – cacti

+0

Cần lưu ý rằng một trong những điều tuyệt vời về itertools.product là nó không tạo ra các danh sách trung gian, mà sẽ liên quan đến rất nhiều phụ thêm và các thay đổi kích thước mảng và bộ nhớ đằng sau hậu trường. Vì vậy, phiên bản này không chỉ thanh lịch, mà còn nhanh hơn và dễ dàng hơn nhiều trên bộ thu gom rác! Nếu vòng lặp lồng nhau của bạn chiếm nhiều thời gian chạy của bạn khi lược tả phương pháp này là đáng thử. –

8

Nếu bạn đã có numpy như một sự phụ thuộc đã có, numpy.ndindex sẽ làm các trick ...

>>> for x,y,z in np.ndindex(2,2,2): 
...  print x,y,z 
... 
0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 
+0

Hmm ... Dường như điều này cũng giống như 'itertools.product'. Nên đã thấy rằng một đến ... :-) – mgilson

+0

Tôi thích giải pháp này! Nó thực sự ngắn gọn, mặc dù nó sẽ là một thành ngữ 'numpy' hơn một thành ngữ python. – Bakuriu

+7

@ Bakuriu - Tôi đến từ quan điểm rằng 'python' không có 'numpy' chỉ là một món đồ chơi sáng bóng ... Nhưng tôi biết đó không phải là quan điểm của mọi người :-). – mgilson

7

Sử dụng itertools.product():

import itertools 
for x, y, z in itertools.product(range(x_size), range(y_size), range(z_size)): 
    pass # do something here 

Từ các tài liệu:

Descartes sản phẩm của iterables đầu vào.

Tương đương với lồng nhau cho vòng lặp trong biểu thức trình tạo.
...

0

Tùy thuộc vào nội dung bên trong vòng lặp. Nếu xử lý danh sách, bạn có thể sử dụng một số điện thoại list comprehension

Đối với trường hợp tổng quát hơn, hãy xem this post trên công cụ lặp.