2011-10-25 32 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'    

感谢

注:

完全工作代码:

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); for word_gen中的单词:单词[单词] + = 1'。 –

+0

@TimPietzcker:实际上,来自同一模块的'计数器'在这里比较好。完美,甚至。为什么我以前没有想到它?感谢这个想法。 –

回答

4

在Python 3中,只使用items,您以前使用iteritems

新的items()返回支持迭代的dictionary view object以及lenin

当然,在top_words = (words.iteritems(), ...中,您忘记了调用sorted函数。


编辑:请参阅我的其他答案,以获得更好的解决方案。

+0

哇谢谢彼得,只是为了澄清,我将如何调用排序函数? sorted(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不能多谢你!对于每个人受益最终的代码是: 从串进口标点符号 从操作者进口itemgetter N = 100 字= {} words_gen =(word.strip(标点符号).lower(),用于打开(“poi_run线.TXT“) 用于字在line.split()) 用于字在words_gen: 字[字] = words.get(字,0)+ 1 top_words =排序(words.items(),键= itemgetter(1),reverse = True)[:N] for word,top_words中的频率: print(“%s%d”%(word,frequency)) – Fruitful

2

从Python 3.x都有implementation documents

“此外,dict.iterkeys(),dict.iteritems()和dict.itervalues() 方法不再受支持。“

见上文实际的链接得到正确的API为3.X

最简单的方法是使用地图()或过滤器()来获取迭代钥匙。

+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