2016-08-07 7 views
-1

の修正とPythonの:は、forループ私はこれの.txtファイルを持っているiterationlist

king james version of the bible 
the first book of moses called genesis 

私は.txtファイルの統計のためのpythonスクリプトを使用するには、ファイルがリストに読み込まれfinal_list、その後、I (長いスクリプトの一部)は、このコードを実行します。

私の問題は、私のリストの一部は、私は、フォームの出力を見ている疑いがあるため、ループで使用されていないことである
for word in final_list: 
    output_list.append((word,final_list.count(word))) 

    final_list[:] = [x for x in final_list if x != word] 
    #DEBUGGING 
    print(len(final_list)) 
    print(final_list) 

12 
['james', 'version', 'of', 'the', 'bible', 'the', 'first', 'book', 'of', 'moses', 'called', 'genesis'] 
11 
['james', 'of', 'the', 'bible', 'the', 'first', 'book', 'of', 'moses', 'called', 'genesis'] 
9 
['james', 'of', 'bible', 'first', 'book', 'of', 'moses', 'called', 'genesis'] 
8 
['james', 'of', 'bible', 'book', 'of', 'moses', 'called', 'genesis'] 
6 
['james', 'bible', 'book', 'moses', 'called', 'genesis'] 
5 
['james', 'bible', 'book', 'moses', 'called'] 

これは私のpython for-loopが実際にどのように動作するのか不思議です。

+4

あなたのコードは単語頻度を非常に非効率的にカウントします。 'collections.Counter()'を見てください。これはあなたの仕事をより簡単かつ迅速に行います。 –

+0

ありがとう、私はそれを調べます。それでも、これは反復されていない最後の5単語の問題ではないと思いますよね? –

+3

反復処理中のリストを変更しないでください。この動作は未定義です。 – Daniel

答えて

1

問題は、あなたがリストを変更していることです。最初の反復の後、Pythonのイテレーターはリストの "position 0"を見なくなり、 "position 1"に移動します。最初に位置0(king)の要素を削除したため、位置1にあった要素(james)は現在位置0になります。つまり、位置1の要素をPythonが参照すると、もともと位置2(version)にあります。

最後に、Pythonのイテレーターはリストの終わりを越えた位置に移動しています。そのため、あなたがやったことは間違いありませんが、早すぎると思われる方法で終了します。

+0

これは完璧な意味合いです、ありがとうございます。 –

2

forループ内で反復処理するリストを変更しないでください。さもなければ、あなたはこの種の奇妙な行動を取るでしょう。最終リストのコピーを使用することをお勧めします。

final_copy = final_list[:] 
for word in final_list: 
    output_list.append((word,final_copy.count(word))) 
    final_copy = [x for x in final_copy if x != word] 
+0

この方法では、 'output_list'に複数の単語のインスタンスが複数存在します。 –

関連する問題