【问题标题】:Python word count and rankPython 字数和排名
【发布时间】:2011-10-25 11:47:05
【问题描述】:

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

再次感谢大家

【问题讨论】:

  • top_words = (words.iteritems(), key=itemgetter(1), reverse=True)[:N] - 你是不是漏掉了一些函数名?
  • 您可能想使用defaultdict: words = defaultdict(int); for words in word_gen: words[word] += 1
  • @TimPietzcker:实际上,来自同一模块的Counter 在这里更好。完美,甚至。为什么我之前没有想到呢?谢谢你的想法。
  • @PetrViktorin:当然。我总是忘记Counter。好多了。但似乎我们已经把他输给了 Perl(颤抖)。好吧,他的损失比我们的多:)

标签: python python-3.x


【解决方案1】:

在 Python 3 中,只使用 items,之前使用的是 iteritems

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

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


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

【讨论】:

  • 哇,谢谢 Petr,澄清一下,我该如何调用 sorted 函数?排序(top_words = (words.items(), key=items(1), reverse=True))[:N] ?
  • top_words = sorted(words.items(), key=itemgetter(1), reverse=True)[:N]
  • Petr 感激不尽!为了大家的利益,最终代码是: 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()) 用于 words_gen 中的单词:words[word] = words.get(word, 0) + 1 top_words = sorted(words.items(), key=itemgetter(1), reverse=True)[:N]对于单词,top_words 中的频率: print ("%s %d" % (word, frequency))
  • 代码在 cmets 中效果不佳,但您可以编辑我的答案并将代码放在那里。但是,请参阅我的其他答案以获得更好的解决方案 - 抱歉,我之前没有想到。
【解决方案2】:

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

【讨论】:

  • 我喜欢这个...我会让你知道我的进展如何!!
【解决方案3】:

来自 Python 3.x implementation documents

"另外,dict.iterkeys()、dict.iteritems() 和 dict.itervalues() 不再支持方法。”

查看上面的链接以实际获取 3.x 的正确 API

最简单的方法是使用 map() 或 filter() 来获取迭代键。

【讨论】:

  • 谢谢你们。我要迁移到 Perl !
猜你喜欢
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多