2013-06-13 5 views
0
나는 다음과 같은 설정이

:컬렉션을 반복하는 동안 컬렉션을 수정할 때 위험이 있습니까?

co_occurrences[word][file_name] = occurrence_count/co_occurrences["__length"][file_name] 

위험 :

co_occurrences = defaultdict(lambda: defaultdict(int)) 
# Populate the dictionary... 

for word, occurrence_vector in co_occurrences: 
    if word == "__length": continue 

    for file_name, occurrence_count in occurrence_vector: 
     co_occurrences[word][file_name] = occurrence_count/co_occurrences["__length"][file_name] 

이 라인인가? 위험한 것은 각 키를 한 번만 반복하려는 것이므로이 동작을 수정하는 모든 코드는 위험합니다. 내가 반복하는 데이터 구조를 수정하고 있기 때문에 그럴 것 같아.

+1

co_occurrences.keys() : for_word = co_occurrences [word]'for for word를 사용하여이 키의 사본을 만들고 그 대신 반복 할 수 있습니다. – Perkins

+1

또한 당신의 dict에 magic entry''__length ''를 갖는 것은 정말로 이상합니다. 파일 이름을 길이에 매핑하는'file_length' dict를 만드십시오. – U2EF1

+0

관련 항목 : http://stackoverflow.com/a/2315529/846892 –

답변

3

언급 한 바와 같이 일반적으로 문제가되는 것은 사전의 크기가 변경된 경우입니다. 그런 일이 발생하면 Exception이 발생하고 실행이 중지되므로 RuntimeError없이 실행하면 아무 일도하지 않아도됩니다.

2

반복되는 데이터의 구조를 변경하는 경우에만 위험합니다. 키 추가/제거. 그렇지 않으면 기존 키를 편집 할 수 있습니다.

관련 문제