程序应该读取给定的文件,用字典计算每个单词的出现次数,然后创建一个名为report.txt的文件并输出单词及其频率列表
infile = open('text file.txt','r')
dictionary = {}
# count words' frequency
for i in range(1,14):
temp = infile.readline().strip().split()
for item in temp:
if dictionary.has_key(item) == False:
dictionary[item] = 1
elif dictionary.has_key:
temp2 = dictionary.get(item)
dictionary[item] = temp2 + 1
infile.close()
outfile = open('report.txt','w')
outfile.write( for words in dictionary:
print '%15s :' %words, dictionary[words])
一切都在计数部分有效,但是 恰好在写输出的最后部分,我意识到我不能在写方法中放置for循环
答案 0 :(得分:5)
您需要将write
放在 for
循环中:
for words in dictionary:
outfile.write('%15s : %s\n' % (words, dictionary[words]))
或者你可以使用理解,但他们有点忍者,可能更难阅读:
outfile.write('\n'.join(['%15s : %s' % key_value for key_value in dictionary.items()]))
答案 1 :(得分:1)
正如已接受的答案中已经说过的那样,您需要write
循环内的for
。但是,在使用文件时,最好在with
上下文中执行操作,因为这会自动处理文件的关闭。 e.g。
with open('report.txt','w') as outfile:
for words in dictionary:
outfile.write('%15s : %s\n' % (words, dictionary[words]))
答案 2 :(得分:0)
您的代码包含几个不足之处:
您没有使用 has_key 而且您没有直接与 True / False 进行比较 - 这是多余的和坏的风格(任何语言)
if dictionary.has_key(item) == False:
应该是
`if not item in dictionary`
值得一提的是,首先使用正面测试会更有效率 - 因为文件中大多数单词的出现次数可能超过1次
dictionary.has_key 返回对 has_key 方法的引用 - 其中布尔值等于True(您的代码意外工作,因为无论第一个条件是第二个是永远是真的)。简单的 else 就足够了
条件中的最后两个语句可能只是重写为
dictionary[item] += 1
那就是说,你可以使用collections.Counter来计算单词
dictionary = Counter()
for lines in source_file:
dictionary.update(line.split())
(BTW,在拆分之前剥离是多余的)