首先我提前道歉,如果我的问题很难理解,因为我是python的初学者而且因为已经很晚了而累了。
我试图找出为什么我在创建此函数时继续接收错误,以获取文本文件并创建包含单词和频率的字典,并打印文件中频率最高的单词。 / p>
这是我的代码:
def poet(filename):
word_frequency = {}
with open(filename,'r') as f:
for line in f:
for word in line.split():
word = word.replace('.',"")
word = word.replace(',',"")
word = word.replace(';',"")
if word in word_frequency:
word_frequency[word] += 1;
else:
word_frequency[word] = 1;
most_freq_word = max(word_frequency, key=word_frequency)
print("The word " + most_freq_word + " is in text ")
str(word_frequency[most_freq_word]) + " times"
print(word_frequency)
poet('Poem.txt')
以下是我收到的错误:
Traceback (most recent call last):
File "C:/Users/Noah/Desktop/Python/3.py", line 20, in <module>
str(word_frequency[most_freq_word]) + " times"
NameError: name 'word_frequency' is not defined
此外,如果有任何不清楚的地方请发表评论,我会立即回复,谢谢你。
编辑:
感谢您的回复,我已将其实现到我的代码中,但我现在收到此错误:
Traceback (most recent call last):
File "C:/Users/Noah/Desktop/Python/3.py", line 20, in <module>
poet('FrostPoem.txt')
File "C:/Users/Noah/Desktop/Python/3.py", line 14, in poet
most_freq_word = max(word_frequency, key=word_frequency)
TypeError: 'dict' object is not callable
新代码是:
def poet(filename):
word_frequency = {}
with open(filename,'r') as f:
for line in f:
for word in line.split():
word = word.replace('.',"")
word = word.replace(',',"")
word = word.replace(';',"")
if word in word_frequency:
word_frequency[word] += 1;
else:
word_frequency[word] = 1;
most_freq_word = max(word_frequency, key=word_frequency)
print("The word " + most_freq_word + " is in text " + \
str(word_frequency[most_freq_word]) + " times")
print(word_frequency)
poet('Poem.txt')
答案 0 :(得分:1)
啊哈,这是你的问题:你的几行应该在里面这个函数,如下所示:
def poet(filename):
word_frequency = {}
with open(filename,'r') as f:
for line in f:
for word in line.split():
word = word.replace('.',"")
word = word.replace(',',"")
word = word.replace(';',"")
if word in word_frequency:
word_frequency[word] += 1;
else:
word_frequency[word] = 1;
most_freq_word = max(word_frequency, key=word_frequency)
print("The word " + most_freq_word + " is in text " + \
str(word_frequency[most_freq_word]) + " times")
print(word_frequency)
poet('Poem.txt')
现在,您可能希望此功能更具可重用性,例如,如果您不想立即打印但想要使用word_frequency
做更多事情。在这种情况下,您需要一个return
语句,您的代码可能如下所示:
def poet(filename):
word_frequency = {}
with open(filename,'r') as f:
for line in f:
for word in line.split():
word = word.replace('.',"")
word = word.replace(',',"")
word = word.replace(';',"")
if word in word_frequency:
word_frequency[word] += 1;
else:
word_frequency[word] = 1;
return word_frequency
word_freq = poet('Poem.txt')
most_freq_word = max(word_freq, key=word_freq)
print("The word " + most_freq_word + " is in text " + \
str(word_freq[most_freq_word]) + " times")
print(word_freq)
为了响应您的编辑,请替换此行
most_freq_word = max(word_frequency, key=word_frequency)
这一行
most_freq_word = max(word_frequency, key=lambda x:word_frequency[x])
根据键的值获得最大值。
答案 1 :(得分:0)
在python中执行此str(word_frequency[most_freq_word]) + " times"
时,它假设之前已声明word_frequency
。在您word_frequency
函数中声明了poet
。
检查是否存在缩进问题。
你需要字典键
要解决此问题,请使用key=word_frequency.get
答案 2 :(得分:0)
您在函数word_frequency
中定义poet()
,因此范围是本地的,但您在外面使用字典,这会产生错误。
def poet(filename):
word_frequency = {}
with open(filename,'r') as f:
for line in f:
for word in line.split():
word = word.replace('.',"")
word = word.replace(',',"")
word = word.replace(';',"")
if word in word_frequency:
word_frequency[word] += 1;
else:
word_frequency[word] = 1;
most_freq_word = max(word_frequency, key=word_frequency)
print("The word " + most_freq_word + " is in text ")
str(word_frequency[most_freq_word]) + " times"
print(word_frequency)
poet('Poem.txt')
将所有指令放在函数中,它应该可以工作。
答案 3 :(得分:0)
您可以按如下方式使用Counter:
from collections import Counter
def poet(filename):
with open(filename, "r") as f:
counter = Counter(f.read().split())
return counter
如果你想剥离&#39;,&#39;或&#39;;&#39;例如,只需将其剥离或映射到列表上以删除它们。
答案 4 :(得分:0)
word_frequency
仅在poet
函数的范围内定义。
要在函数外部访问它,您应该将其返回
word_frequency = poet('Poem.txt')
most_freq_word = max(word_frequency, key=word_frequency)
print("The word " + most_freq_word + " is in text ")
str(word_frequency[most_freq_word]) + " times"
print(word_frequency)
还有更好的解决方案可以解决您的问题。您可以查看collections.Counter
。该示例完全符合您的要求