2011-10-25 17 views
5

Python 3.2/Windows環境で語数カウントアプリケーションを処理しています。Pythonの単語数とランク

誰でも次のことが機能しない理由を教えてもらえますか?

from string import punctuation 
from operator import itemgetter 

N = 100 
words = {} 

words_gen = (word.strip(punctuation).lower() for line in open("poi_run.txt") 
             for word in line.split()) 

for word in words_gen: 
    words[word] = words.get(word, 0) + 1 

top_words = (words.iteritems(), key=itemgetter(1), reverse=True)[:N] 

for word, frequency in top_words: 
    print ("%s %d") % (word, frequency) 

トレースバックエラーは次のとおりです。

Message File Name Line Position  
Traceback    
    <module> C:\Users\will\Desktop\word_count.py 13  
AttributeError: 'dict' object has no attribute 'iteritems'    

おかげ

n.b.

完全に動作するコード:

from string import punctuation 
from operator import itemgetter 

N = 100 
words = {} 

words_gen = (word.strip(punctuation).lower() for line in open("poi_run.txt") 
             for word in line.split()) 

for word in words_gen: 
    words[word] = words.get(word, 0) + 1 

top_words = sorted(words.items(), key=itemgetter(1), reverse=True)[:N] 

for word, frequency in top_words: 
    print ("%s %d" % (word, frequency)) 

おかげで再び男

+0

'top_words =(words.iteritems()、キー= itemgetterは、(1)、リバース= true)を[:N] ' - ここにいくつかの関数名がありますか? – eumiro

+0

'defaultdict'を使うとよいでしょう:' words = defaultdict(int); word_genの単語の場合:words [word] + = 1'。 –

+0

@TimPietzcker:実際、同じモジュールの 'Counter 'がここでは良いです。パーフェクト、均等。なぜ私はそれを以前考えなかったのですか?アイデアをありがとう。 –

答えて

4

Python 3では、以前にiteritemsを使用していたところでitemsを使用してください。

新しいitems()は、反復をサポートするdictionary view objectと、leninを返します。

もちろん、top_words = (words.iteritems(), ...では、sortedの機能を忘れてしまいました。


編集:もっと良い解決策は他の回答をご覧ください。

+0

わかりましたPetr、ちょうど明確にするために、私はどのようにソートされた関数を呼び出すでしょうか? ソート(top_words =(words.items()、key = items(1)、reverse = True))[:N] ? – Fruitful

+0

'top_words =ソート済み(words.items()、key = itemgetter(1)、逆= True)[:N]' –

+0

Petr cant十分にありがとう!everyonesのは、利益のために最終的なコードは:文字列インポート句読点 から オペレータインポートからitemgetter N = 100 ワード= {} words_gen =(word.strip(句読点).lower()オープン(「poi_runの行のためのwords_genにおける単語のline.splitにおける単語のための.txt」) ()) : ワード[ワード] = words.get(ワード0)+ 1 top_words =ソート(words.items()、キー= itemgetter(1)、逆= TRUE):top_wordsで[N]単語の 、周波数: プリント( "%sの%dの" %(ワード、周波数)) – Fruitful

2

のPython 3.xのからimplementation documents

「また、dict.iterkeys()、dict.iteritems()とdict.itervalues() メソッドはサポートされなくなりました。

反復キーを取得するために)(最も簡単な方法は、マップを(使用することです3.xの

の正しいAPIを取得し、実際に上記のリンクを参照してください)、またはフィルタ。

+0

この人のためにありがとう。私はPerlに移っています!! – Fruitful

4

collectionsモジュールからCounterクラスを考えてみましょう - それはあなたのためにあなたの最初のforループを行います。

from collections import Counter 

N = 100 
words_gen = ... 

top_words = Counter(words_gen).most_common(N) 

for word, frequency in top_words: 
    print("%s %d" % (word, frequency)) 
+0

... 私はあなたが私が乗る方法を知ってもらおう! – Fruitful