2010-11-11 29 views
6

Đối với khách hàng của tôi, việc lặp qua nhiều bộ đếm sẽ chuyển thành tác vụ lặp lại.Python: Bộ đếm làm tổ

Cách đơn giản nhất sẽ là một cái gì đó như thế này:

cntr1 = range(0,2) 
cntr2 = range(0,5) 
cntr3 = range(0,7) 

for li in cntr1: 
    for lj in cntr2: 
     for lk in cntr3: 
      print li, lj, lk 

Số đếm này có thể dao động từ 3 trên lên và những lồng cho vòng bắt đầu chiếm bất động sản.

Có cách nào Pythonic để làm điều gì đó như thế này không?

for li, lj, lk in mysteryfunc(cntr1, cntr2, cntr3): 
    print li, lj, lk 

Tôi tiếp tục nghĩ rằng một cái gì đó trong itertools sẽ phù hợp với hóa đơn này, nhưng tôi không đủ quen thuộc với các công cụ lặp để hiểu các tùy chọn. Đã có một giải pháp như itertools hay tôi cần phải cuộn của riêng mình?

Cảm ơn, j

Trả lời

7

gì bạn muốn là itertools.product

for li, lj, lk in itertools.product(cntr1, cntr2, cntr3): 
    print li, lj, lk 

sẽ làm chính xác những gì bạn đang yêu cầu. Tên xuất phát từ khái niệm về một sản phẩm Descartes.

+0

Tuyệt vời. Cảm ơn, Winston. –

+0

Hơn nữa (trong trường hợp ai đó có vấn đề hơi khác), giả sử bạn có một mảng 'cntr = [cntr1, cntr2, cntr3]'. Sau đó gọi 'itertools.product (cntr)' sẽ không hoạt động. (Nó chỉ in tất cả 1-tuple trong đó phần tử đầu tiên là một phần tử 'cntr'; có nghĩa là nó in' cntr'.) Thay vào đó, bạn có thể làm 'itertools.product (* cntr)'. – ShreevatsaR

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