首页 > 解决方案 > 计算文件中给定索引下单词的频率

问题描述

我正在尝试计算文件中特定索引下单词的出现次数并将其打印为字典。

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name, "r") as file:
        content_of_file = file.readlines()
        dict_of_fruit_count = {}
        for line in content_of_file:
            line = line[0:-1]
            line = line.split("\t")
            for fruit in line:
                fruit = line[1]
                dict_of_fruit_count[fruit] = dict_of_fruit_count.get(fruit, 0) + 1
    return dict_of_fruit_count


print(count_by_fruit())

输出:{'apple': 6, 'banana': 6, 'orange': 3}

我得到了这个输出,但是,它没有正确计算单词的频率。在四处寻找之后,我似乎没有找到合适的解决方案。谁能帮我找出我的错误?

我的文件具有以下内容:(数据用制表符分隔,在示例中放置“\t”,因为格式正在被stackoverflow更改)

  1. 我是 2018 年 \t apple \t 的第一行
  2. 我是 2017 年的 \t orange \t 第二行
  3. 我是 2016 年的 \t apple \t 的第三行
  4. 从 2010 年开始,我是第 4 行的 \t 香蕉 \t
  5. 我是 1999 年的 \t 香蕉 \t 的第 5 行

标签: python-3.xdictionary

解决方案


您在同一行上循环了太多次。请注意,您得到的结果都是您预期的 3 倍。

此外,在 Python 中,您也不需要读取整个文件。只需逐行遍历文件对象。

尝试:

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name, "r") as f_in:
        dict_of_fruit_count = {}
        for line in f_in:
            fruit=line.split("\t")[1]
            dict_of_fruit_count[fruit] = dict_of_fruit_count.get(fruit, 0) + 1
    return dict_of_fruit_count

可以进一步简化为:

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name) as f_in:
        dict_of_fruit_count = {}
        for fruit in (line.split('\t')[1] for line in f_in):
            dict_of_fruit_count[fruit] = dict_of_fruit_count.get(fruit, 0) + 1
        return dict_of_fruit_count 

或者,如果您可以使用Counter

from collections import Counter 

def count_by_fruit(file_name="file_with_fruit_data.txt"):
    with open(file_name) as f_in:
        return dict(Counter(line.split('\t')[1] for line in f_in))

推荐阅读