寻找单词频率 - 没有计数器

时间:2014-05-27 17:00:59

标签: python python-3.3

我是初学者,通过http://GrokLearning.com

学习Python 3.3

我的目标是编写一个Word Counter程序,从用户读取多行纯文本,然后从用户输入中打印出每个不同的单词,并计算单词出现的次数。所有输入都只是小写字 - 没有标点符号或数字。输出列表将按字母顺序排列。

该计划不接受任何提交计数器或收藏集的提交。当我在Stack Exchange上使用Counter提交解决方案时,编辑器只是假装Counter代码不存在。

这是我到目前为止所做的:

all = []
count = {}
line = input("Enter line: ")
while line:
    word = line.split()
    line = input("Enter line: ")
    for w in word:
        count[w] = word.count(w)
for word in sorted(count):
    print(word, count[word])

我的代码存在的问题:如果一个单词在多行上重复,代码将只计算单词出现的最后一行的出现次数(而不是总出现次数)。

> this is another test test
> test test test test test
> test test test
> 
another 1
is 1
test 3
this 1

我知道我没有利用我的名单“全部”。我曾尝试过all.append(word)来列出用户输入的所有单词,但我的代码计算为0(可能是因为最后一行需要为空以结束while循环?)

作为参考,我已经浏览了所有免费模块,但没有任何付费模块。请原谅我:由于我的知识有限,请用简单的语言解释你的答案。

4 个答案:

答案 0 :(得分:3)

问题在于:

for w in word:
    count[w] = word.count(w)

在您的代码中,您不会添加到您的计数中。相反,每次遇到单词时,重置计数。例如,如果count['this']之前为1,则在您下次遇到它时,您将计数再次设置为1,而不是向其添加1。

第二个问题是表达式word.count(w)。它是一个单词出现在一行上的次数的计数,同时,循环遍历每个单词。这意味着如果你正确更新(而不是重置)你的计数,你将计算太多。

例如,如果该行有三个' test' ,那么您将按3 x 3 = 9更新计数。

要解决此问题,您需要解决两种情况:

  • 如果一个单词已经在计数中(即您之前看过该单词),则将计数增加1
  • 如果单词不在计数中,这是您第一次看到它,将计数设置为1

这是一个建议:

for w in word:
    if w in count:
        count[w] += 1
    else:
        count[w] = 1

答案 1 :(得分:2)

尝试在纸上遵循程序的逻辑,看看有什么事情发生在你身上。

  • 用户输入多行文字
  • 遍历每一行
    • 设置与' word'的出现次数相对应在当前
    • 转到下一行
  • 循环找到的单词
    • 打印字及其频率

因此,对于每一行的读取,您都要将计数器设置为新值,而不考虑较旧的行。

你如何解决这个问题'在纸上?那么您如何将不同的逻辑应用于您的程序?

答案 2 :(得分:2)

最短的修复和最快的代码:

for w in word:
    count[w] = count.get(w, 0) + 1

get方法返回与键关联的值,如果键不存在,则返回第二个可选参数。 (如果未指定second,并且尚未定义密钥,则返回None)。因此,从不存在的所有单词的计数默认为0。然后,对于遇到的每个单词,计数设置为前一个计数+ 1。

答案 3 :(得分:1)

您可以在for循环

中执行以下操作
if w in count:
    count[w] += word.count(w)   # word already in dictionary, update the count
else:
    count[w] = word.count(w)    # word not in dictionary, add count for first time