2013-06-13 73 views
0

我有以下設置:迭代它時修改集合是否有任何危險?

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] 

這是行:

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

危險嗎?由於危險,我的意思是我想遍歷每個鍵一次,只有一次,所以修改此行爲的任何代碼都是危險的。我覺得可能是因爲我正在修改我正在迭代的數據結構。

+1

你可以通過使用co_occurrences.keys()中的for word來解決這個問題:occurrence_vector = co_occurrences [word]'它會生成密鑰列表的一個副本並對其進行迭代。 – Perkins

+1

在你的字典裏還有一個魔術入口'「__length」'真的很奇怪。只需製作一個將文件名映射到其長度的'file_length'字典。 – U2EF1

+0

相關:http://stackoverflow.com/a/2315529/846892 –

回答

3

如前所述,它通常很好,如果字典的大小發生變化就會出現唯一的問題。如果發生這種情況,它會拋出一個Exception並停止執行,所以如果它執行沒有RuntimeError,那麼無論你在做什麼都很好。

2

如果你正在改變你正在迭代的數據的結構,這只是危險的。添加/刪除密鑰,否則編輯現有密鑰是完全正確的。