2016-08-12 9 views
1

私はテキストファイルの各単語の頻度を数えるPythonコードを書こうとしています。コードには一意の単語ごとに1行が表示されます。私が書いたコードは、重複する単語を表示しています。Python - ユニークな単語ごとに1行表示

import string 

text = open('mary.txt','r') 
textr = text.read() 

for punc in string.punctuation: 
    textr = textr.replace(punc, "") 

wordlist = textr.split() 

for word in wordlist: 
    count = wordlist.count(word) 
    print word,':',count 

私の現在の出力は、出力が一度だけat : 2be : 2、およびby : 2を表示する必要があります...

are : 1 
around : 1 
as : 1 
at : 2 
at : 2 
away : 1 
back : 1 
be : 2 
be : 2 
because : 1 
below : 1 
between : 1 
both : 1 
but : 1 
by : 2 
by : 2 

です。それが起こるために私のコードで何を変更すべきですか?

+0

辞書やセットを使用します。 dictはここではもっと意味がありますが、コードセットを書き直すと作業が少なくなります。 – polku

答えて

2

あなたのコードの問題は、すべての単語のリストを作成し、それをループすることです。ユニークな単語だけを格納する何らかの種類のデータ構造を作成したいとします。 A dictはこれを行う良い方法ですが、正確にはこの目的のために作られたCounterという特殊なコレクションがPythonにあります。

はこの試し(未テスト)を得た:(ワード、カウント)がセットにタプルとしてこれを実装するための別の方法として、

from collections import Counter 
import string 

text = open('mary.txt','r') 
textr = text.read() 

for punc in string.punctuation: 
    textr = textr.replace(punc, "") 

counts = Counter(textr.split()) 

for word, count in counts.items(): 
    print word,':',count 
+0

エラーメッセージ 'for word count in counts: ValueError:アンパックする値が多すぎます。' – akse232

+0

@AyZhngそのことを申し訳ありません。 – smarx

+0

ご協力いただきありがとうございます – akse232

0

を、あなたはあなたのソリューションをとっている可能性があり、そして、すべてのエントリを追加しましたセットを印刷した。とにかく@smarxが指摘するように実装を再考するべきでしょうが、これはネイティブコードを使って問題を修正します。

0

あなたはこのような何か試すことができます。

import string 

frequency = {} 
text = open('mary.txt','r') 
textr = text.read() 

for punc in string.punctuation: 
    textr = textr.replace(punc, "") 

wordlist = textr.split() 

for word in wordlist: 
    count = frequency.get(word,0) 
    frequency[word] = count + 1 

frequency_list = frequency.keys() 

for words in frequency_list: 
    print words,':', frequency[words] 
関連する問題