복붙노트

[PYTHON] for 중첩 된 루프 방지하기

PYTHON

for 중첩 된 루프 방지하기

파이썬을 사용하는 다른 코드에서 매개 변수 테스트를하려고합니다. 6 개의 독립적 인 매개 변수를 테스트해야하지만 가능한 모든 조합이 필요합니다.

각 매개 변수에는 전달해야하는 최소값, 최대 값 및 1 단계 값이 있습니다. 내 머리 속에 떠오른 첫 번째 쉬운 솔루션은 다음과 같이 중첩 된 for 루프 구조였습니다.

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
                        '''

나는 결정했다, 부정! 이것은 서 있지 않아야한다. 그래서 저는 이것을 재귀 적으로, 적어도 최소한 6 회 중첩하지 않는 방법을 찾아 내려고 노력해 왔습니다. 그렇게 할 수있는 좋은 계획을 세울 수는 없습니다. 저에게 가장 큰 장애물은 각 변수가 다른 최소, 최대 및 단계 값을 가지고 있다는 것입니다.

지금까지의 내 생각은별로 도움이되지 않습니다. 몇 가지 재귀 함수를 만들려고 노력하고 있지만 함수 내에서 루프를 중첩하지 않고는 알아낼 수 없습니다. 여기 itertools.product에 대한 많은 참조를 보았지만 그 작업을 수행하는 방법을 알 수는 없습니다.

편집 : 내가하고있는 일은 매개 변수의 조합,이 매개 변수가있는 파일 작성,이 파일로 다른 코드 실행 및 해당 코드의 출력 분석을 통해 명명 된 디렉토리를 작성하는 것입니다. 말 그대로 마지막 루프를 제외하고 for 루프 중 아무 것도하지 않습니다. 많은 매개 변수에는 2 개의 값만 있고, 일부에는 10이 있고, 다른 매개 변수에는 3이 있습니다. 단지 종류가 다릅니다.

해결법

  1. ==============================

    1.제품 사용 방법은 다음과 같습니다.

    제품 사용 방법은 다음과 같습니다.

    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(....)
    

    또는 조금 더 조밀하게 :

    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(....)
    
  2. ==============================

    2.아마 itertools.product : http://docs.python.org/library/itertools.html#itertools.product를 사용할 수 있습니다.

    아마 itertools.product : http://docs.python.org/library/itertools.html#itertools.product를 사용할 수 있습니다.

    좋아하는 것

    for var1, var2 in itertools.product(xrange(min1, max1, step1), xrange(min2, max2, step2)):
        # stuff
    

    . . . 거기에있는 6 개의 모든 덩어리들만 있으면됩니다.

  3. from https://stackoverflow.com/questions/11174745/avoiding-nested-for-loops by cc-by-sa and MIT license