我的字典怎么了?

时间:2012-10-23 20:33:33

标签: python

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

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

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

进行排序

5 个答案:

答案 0 :(得分:2)

其他答案指出了问题所在。如果您正在使用python 2.7+,那么使用collections模块中的Counter类可以更轻松地完成此操作。

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

答案 1 :(得分: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())将返回仅列出键的排序列表(因为这就是你所提供的所有键)。

答案 2 :(得分:1)

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

for k in ke:
    print k, dict[k]

答案 3 :(得分: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。另请参阅上面链接的文档中的示例部分。

答案 4 :(得分:0)

根据更重要的内容 - 订购或统计 - 您可以使用ordered dictionary

中的counter dictionarycollections module

OrderedDict按照添加顺序记住元素;反计数元素

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

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

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