2012-06-24 70 views
17

Tôi đang cố gắng thực hiện một số thử nghiệm tham số trên một mã khác bằng cách sử dụng python. Tôi cần phải kiểm tra 6 thông số độc lập, nhưng tôi cần tất cả các kết hợp có thể có của chúng.Tránh lồng nhau cho các vòng

Mỗi thông số có giá trị tối thiểu, giá trị cực đại và giá trị bước cần được chuyển cho nó. Giải pháp dễ dàng đầu tiên xuất hiện trong đầu tôi là một cấu trúc vòng lặp trông rất kinh khủng, như thế này:

for var1 in xrange(min1,max1,step1): 
    for var2 in xrange(min2,max2,step2): 
     ... 
      ... 
       ... 
        for var6 in xrange(min6,max6,step6): 
         ''' 
         Do something and be icky in the process due 
         to being in the middle of six nested for loops 
         ''' 

Tôi quyết định, không! Điều này sẽ không đứng. Vì vậy, tôi đã cố gắng để làm việc ra một cách để làm điều này đệ quy, hoặc ít nhất, không lồng nhau sáu lần. Tôi thực sự không thể đưa ra một kế hoạch tốt để làm như vậy. Trở ngại lớn nhất đối với tôi là mỗi biến có giá trị tối thiểu, tối đa và bước khác nhau.

Suy nghĩ của tôi cho đến nay không hữu ích lắm. Tôi tiếp tục cố gắng để làm cho một số công việc chức năng đệ quy, nhưng tôi chỉ có thể không tìm ra nó mà không làm tổ nhiều hơn cho các vòng trong hàm. Tôi đã nhìn thấy rất nhiều tài liệu tham khảo để itertools.product trên đây, nhưng tôi không thể hoàn toàn tìm ra cách để làm cho công việc đó hoặc.

Chỉnh sửa: Những gì tôi đang làm là tạo thư mục có tên sau khi kết hợp các tham số, viết tệp với các thông số đó, chạy một mã khác với tệp này và phân tích đầu ra từ mã đó. Tôi không làm gì theo nghĩa đen cho bất kỳ vòng lặp nào ngoại trừ vòng cuối cùng. Rất nhiều tham số chỉ có 2 giá trị, một số có 10 giá trị, số khác có 3 giá trị ... nó chỉ khác nhau.

+2

gì nên được thực sự thực hiện bên trong tất cả những vòng? tôi nghĩ rằng đó là câu hỏi quan trọng nhất - có một số đường cú pháp để ẩn các vòng lặp (nhưng vẫn thực hiện chúng), nhưng để tránh các vòng lặp lồng nhau, điều quan trọng nhất là understant vấn đề ban đầu – Aprillion

+1

@deathApril là đúng: Tôi đã cung cấp cho bạn một cách để tránh các vòng bên dưới, nhưng bạn vẫn phải thực hiện tất cả các lần lặp đó. Tốt hơn là sử dụng một thuật toán khác để tránh lặp lại. –

+0

Đã thêm một bản chỉnh sửa để giải thích lý do tại sao tôi cần số này – rapidsnow

Trả lời

34

Dưới đây là làm thế nào để sử dụng product:

x1 = xrange(min1,max1,step1) 
x2 = xrange(min2,max2,step2) 
x3 = xrange(min3,max3,step3) 
... 

for v1, v2, v3, v4, v5, v6 in itertools.product(x1, x2, x3, x4, x5, x6): 
    icky_thing(....) 

hoặc một chút gọn hơn:

ranges = [ 
    xrange(min1,max1,step1), 
    xrange(min2,max2,step2), 
    xrange(min3,max3,step3), 
    ... 
] 

for v1, v2, v3, v4, v5, v6 in itertools.product(*ranges): 
    icky_thing(....) 
+0

mã đẹp <3 – gabeio

+0

Tuyệt vời! Đã định đặt câu hỏi về cách thực hiện việc này! – madbitloman

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