Python函数用于获取文本文件并使用键作为单词和值创建字典作为频率

时间:2015-11-25 08:54:38

标签: python dictionary

首先我提前道歉,如果我的问题很难理解,因为我是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')

5 个答案:

答案 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。该示例完全符合您的要求