2017-07-12 13 views
0

時にサイズを変更:はRuntimeError:辞書はこれが私のコードで反復

import os 
import collections 
def make_dictionary(train_dir): 
    emails=[os.path.join(train_dir,f) for f in os.listdir(train_dir)] 
    all_words=[] 
    for mail in emails: 
     with open(mail) as m: 
      for i,line in enumerate(m): 
       if i==2: #Body of email is only 3rd line of text file 
        words=line.split() 
        all_words+=words 
    dictionary=collections.Counter(all_words) 
    # Paste code for non-word removal here(code snippet is given below) 
    list_to_remove=dictionary.keys() 
    for item in list_to_remove: 
     if item.isalpha()==False: 
      del dictionary[item] 
     elif len(item)==1: 
      del dictionary[item] 
    dictionary=dictionary.mostcommon[3000] 
    print (dictionary) 

make_dictionary('G:\Engineering\Projects\Python\Documents\enron1\ham') 

私はエラー「例外RuntimeErrorを:辞書には、反復処理中にサイズを変更し、」受け付けており、このコードを書くことに。私は ディレクトリ内のテキストファイルのみを持っています。どんな助けもありがとう。

+0

'list_to_remove = dictionary.keys()'を 'list_to_remove = [k for dictionary for k] 'に変更すると' 'dict'に' keys'の 'list'を関連付ける* dict'は 'list'に反映されません –

+0

ありがとうございます。できます。 @ Ev.Kounis –

答えて

0

、この2つのコードスニペットを見てみましょう:

d = {1: 1, 2: 2} 
f = [x for x in d] 
del d[1] 
print(f) # [1, 2] 

と:

d = {1: 1, 2: 2} 
f = d.keys() 
del d[1] 
print(f) # dict_keys([2]) 

あなたが見ることができるように、最初のもので辞書d、リストfが1に関連していません別の;ディクテーションの変更はリストに反映されません。我々はリストfを作成する方法には、そうまた、辞書の要素を削除すると、リストからそれらを削除辞書にをリンクされたまま第二のスニペットで

、。

両方の動作が役立つかもしれませんが、シナリオでは最初の動作です。

関連する問題