2012-11-30 1 views
0

여기이 웹 사이트에서 The Python Yield Keyword Explained을 통해 읽었으며 일부 기능에서는 약간 놀았지만 내 인생에서이 문제를 해결하지 못했습니다. 문제. 생성기가 빈 목록을 잘못 생성했습니다

import collections 
import itertools 
import pprint 
import copy 

partition = [] 
def partition_prime_factors(partition_structure, prime_factors): 
    # partition_structure is a list 
    # prime_factors is a collections.Counter object 

    global partition  

    for subsection_size in reversed(partition_structure): 
     partition_structure.remove(subsection_size)   
     subsections = list(itertools.combinations(prime_factors.elements(), subsection_size)) 

     for subsection in subsections: 
      prime_factors -= collections.Counter(subsection) 
      partition.append(list(subsection)) 

      if len(prime_factors) == 0: 
       pprint.pprint(globals()['partition']) 

       yield copy.copy(partition) 
      else: 
       for j in partition_prime_factors(partition_structure, prime_factors): 
        pass 

      prime_factors += collections.Counter(subsection) 
      partition.remove(list(subsection)) 

     partition_structure.append(subsection_size) 


print [i for i in partition_prime_factors([1, 3], collections.Counter([2, 2, 3, 5]))] 


>>> [[2, 2, 3], [5]] 
>>> [[2, 2, 5], [3]] 
>>> [[2, 3, 5], [2]] 
>>> [[2, 3, 5], [2]] 
>>> [[2], [2, 3, 5]] 
>>> [[2], [2, 3, 5]] 
>>> [[3], [2, 2, 5]] 
>>> [[5], [2, 2, 3]] 
>>> [] 

그래서 파티션 올바르게 평가하지만 수득되지되고 :

는 I 값이 예에 공급 된 다음 생성 기능을 갖는다. 방법!?!?!?! 웃음! 나는 심지어 같은 객체를 참조함으로써 망쳐 놓는 것을 피하기 위해 양보하기 전에 각 파티션의 사본을 만듭니다.

+0

당신이 어떻게 항복 키워드 ** **에 대해 언급하는 웹 사이트 :

for j in partition_prime_factors(partition_structure, prime_factors): pass 

당신이 값을 다시 산출해야합니까? 링크를 제공하십시오. – arulmr

+0

@arulmr oops. 질문의 이름이 잘못되었습니다. 나는 URL에 지금 고마워했다. – nebffa

답변

2

partition_prime_factors에 대한 재귀 호출에서 얻은 값을 산출하지 않습니다. 당신은 재귀 경우 :

for j in partition_prime_factors(partition_structure, prime_factors): 
    yield j 
+0

Lol 어리석은 .... .... 내가 함수의 나머지 부분을 디버깅 할 때 전에는 작동하지 않았으므로 문제가 될 것이라고 기대하지 않았다. 이것은 내 문제를 완벽하게 해결합니다. – nebffa

관련 문제