我是初学者,通过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循环?)
作为参考,我已经浏览了所有免费模块,但没有任何付费模块。请原谅我:由于我的知识有限,请用简单的语言解释你的答案。
答案 0 :(得分:3)
问题在于:
for w in word:
count[w] = word.count(w)
在您的代码中,您不会添加到您的计数中。相反,每次遇到单词时,重置计数。例如,如果count['this']
之前为1,则在您下次遇到它时,您将计数再次设置为1,而不是向其添加1。
第二个问题是表达式word.count(w)
。它是一个单词出现在一行上的次数的计数,同时,循环遍历每个单词。这意味着如果你正确更新(而不是重置)你的计数,你将计算太多。
例如,如果该行有三个' test' ,那么您将按3 x 3 = 9更新计数。
要解决此问题,您需要解决两种情况:
这是一个建议:
for w in word:
if w in count:
count[w] += 1
else:
count[w] = 1
答案 1 :(得分:2)
尝试在纸上遵循程序的逻辑,看看有什么事情发生在你身上。
因此,对于每一行的读取,您都要将计数器设置为新值,而不考虑较旧的行。
你如何解决这个问题'在纸上?那么您如何将不同的逻辑应用于您的程序?
答案 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