2013-05-08 1 views
0

파일 이름이 루프에 반복적으로 제공되는 아래 코드와 같은 부분에 있습니다. 위와 같이 "set"방식을 사용하기 때문에 동일한 이름을 가진 두 개의 파일 이름이 처리되지 않도록해야합니다 (중복 처리를 피하기 위해).중복 처리를 피하기 위해 집합 사용

그러나 예상대로 작동하지 않는 것 같습니다. 비어있는 processed_set이 생기고 로직이 예상대로 실행되지 않습니다.

else: 
    create_folder(filename) 
    processed_set=set() 

    if xyz ==1: 
     if filename not in processed_set: 
      createdata(name) 
      processed_set.add(filename) 
     else: 
      avoid_double_process(name) 
+7

코드에 도달 할 때마다'processed_set'을 생성합니다. 루프 밖에서 생성을 이동하십시오. – user4815162342

답변

1

코드 예제에서 추측 할 수 있고 함수 이름을 기반으로 추측 할 수 있으므로 filename이 이미 처리 된 경우 코드 실행을 피하는 것이 좋습니다. createdatacreate_folder이 같은 파일 이름을 여러 번 실행하지 않으 두 기능이있는 경우

processed_set = set() #initialize set outside of loop 
for filename in filenames: #loop over some collection of filenames 
    if filename not in processed_set: #check for non-membership 
     processed_set.add(filename) #add to set since filename wasn't in the set 
     create_folder(filename) #repositioned based on implied semantics of the name 
     createdata(filename) 

은 또는, 당신은 필터링 장식을 만들 수 있습니다 당신은 이런 식으로 할 것이다. 당신이 실제로 반환 값을 걱정하는 경우, 당신은 당신이 한 번만 실행하려는 기능 전에 함수 정의에

def run_once(f): 
    f.processed = set() 
    def wrapper(filename): 
     if filename not in f.processed: 
     f.processed.add(filename) 
     f(filename) 
    return wrapper 

다음 라인에 @run_once 포함 memoizing 데코레이터를 사용하고자하는 것입니다.

+0

감사합니다. 예. 파일이 한 번 처리 된 경우 처리를 이중화하려는 노력을 피하고자했습니다. 첫 번째 코드는 트릭을 수행합니다. 몇 가지 제한 사항으로 인해 두 번째 방법을 사용할 수 없습니다. – user741592

0

왜 처음에는 세트를 작성한 다음 나중에 세트에서 파일을 처리하지 않습니까? 이미 존재하는 세트는 같은 요소를 추가하지 않습니다.

>>> myset = { element for element in ['abc', 'def', 'ghi', 'def'] } 
>>> myset 
set(['abc', 'ghi', 'def']) 
0

코드가 더 유용 할 수 있습니다. 이 경우, 그러나 당신을 확실하지 조건은 그래서 기본적으로

processed_set = set() 

를 초기화하는 경우와 같은 블록에있는 경우 경우 XYZ! = 1 다음은 빈 세트로 남아 있습니다 아무것도 세트에 추가되지 도착 . 첫 번째 else 문을 여러 번 실행하는 루프 설정이있는 경우 매번 설정 내용을 지우는 것입니다.

다시 말하지만, 지금은 조금 흐릿 해져서 코드가 어떻게 흐르고 있는지 잘 모르겠습니다. 주변 코드를 더 추가하면 사람들이 쉽게 도와 줄 수 있습니다.

관련 문제