0

我正在运行以下代码来计算一个单词在文本文件中出现的次数。

def print_words(filename):
    f = open(filename, 'rU')
    dict={}
    for line in f:
       words=line.split()
       for word in words:
          if dict.get(word):
              dict[word]=dict[word]+1
          else: 
              dict[word]=1
    ke = sorted(dict.keys())
    for k, v in ke: print k, v

字典文件应该包含每个单词及其计数。我能够让它正常工作。但我没有排序

4

5 回答 5

2

其他答案指出了问题所在。如果您使用的是 python 2.7+,这是一种更简单的方法,使用模块中的Countercollections

from collections import Counter

def print_words(filename):
    with open(filename, 'rU') as f:
        counts = Counter(f.read().split())
    for k, v in sorted(counts.items()):
        print k, v
于 2012-10-23T20:48:29.187 回答
1

代替

ke = sorted(dict.keys())
for k, v in ke: print k, v

尝试:

for k in sorted(dict.keys()):
    print k, dict[k]

sorted(dict.keys())将返回仅包含键的排序列表(因为这就是您提供的全部内容)。

于 2012-10-23T20:36:39.547 回答
1

sorted(dict.keys())返回仅包含键的排序列表。您的 for 循环错误地期望在同一列表中找到值。请尝试以下代码:

for k in ke:
    print k, dict[k]
于 2012-10-23T20:36:42.540 回答
1

对于 2.5 和 2.6 兼容的解决方案,请使用defaultdict

from collections import defaultdict
counter = defaultdict(int)

for word in f.read().split():
    counter[word] += 1

这将返回一个字典(实际上是一个子类,但使用方式相同),您可以在其中查找counter['someword'](返回一个整数)。

工作原理:如果请求的键不存在,则使用给定函数的返回值创建它。在这种情况下,int(),即0。另请参阅上面链接的文档中的示例部分。

于 2012-10-23T21:42:49.770 回答
0

根据更重要的内容 - 顺序或计数 - 您可以使用集合模块中的有序字典计数器字典

OrderedDict 按照添加顺序记住元素;Counter - 计算元素

对于前者,你可以做类似的事情

>>> words = open(filename).read().split()
>>> counters = OrderedDict([(word, words.count(word)) 
                            for word in sorted(list(set(words)))])

您将获得带有计数器的排序字典 - 只需 2 行。

于 2012-10-23T21:07:14.817 回答