2011-10-25 4 views
5

파이썬 3.2/Windows 환경에서 단어 발생 횟수 응용 프로그램에 대한 작업.파이썬 단어 개수 및 순위

아무도 다음 작동하지 않는 이유를 말해 줄 수 있습니까?

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)) 

다시 한번 감사들

파이썬 3.x의에서
+0

'top_words = (words.iteritems(), 키 = itemgetter (1), 역 = true)를 [: N]'- 여기에 함수 이름이 누락되지 않았습니까? – eumiro

+0

'defaultdict'를 사용하는 것이 좋습니다 :'words = defaultdict (int); word_gen에있는 단어들 : words [word] + = 1'. –

+0

@TimPietzcker : 실제로 동일한 모듈의 '카운터'가 더 좋습니다. 완벽 해. 왜 전에 생각하지 않았어? 아이디어를 가져 주셔서 감사합니다. –

답변

4

파이썬 3에서는 이전에 iteritems을 사용했던 items을 사용하십시오.

새로운 items()lenin과 마찬가지로 반복을 지원하는 dictionary view object을 반환합니다.

물론 top_words = (words.iteritems(), ...에서 sorted 기능을 잊어 버렸습니다.


편집 : 더 나은 해결책은 다른 해결책을 참조하십시오.

+0

와우 감사합니다. Petr, 명확히하기 위해 정렬 된 함수를 어떻게 호출합니까? 정렬 됨 (top_words = (words.items(), key = items (1), reverse = True)) [: N] ? – Fruitful

+0

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

+0

Petr Cant는 충분히 감사합니다 !!모든 사람이 이익을 위해 최종 코드는 다음과 같습니다 문자열 가져 오기 문장 에서 운영자 수입에서 itemgetter N = 100 단어 = {} words_gen = (word.strip (구두점) .lower open()을 ("poi_run의 라인 line.split에서 단어 ) "이 .txt())에 words_gen 단어 : 단어 [워드 = 그런 단어 (워드, 0) + 1 = top_words 정렬 (words.items() 키 = itemgetter (1), reverse = True) [: N] 단어의 경우 단어의 빈도 : 인쇄 ("% s % d"% (단어, 빈도)) – Fruitful

2

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