python-3.x - 计算文件中给定索引下单词的频率
问题描述
我正在尝试计算文件中特定索引下单词的出现次数并将其打印为字典。
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更改)
- 我是 2018 年 \t apple \t 的第一行
- 我是 2017 年的 \t orange \t 第二行
- 我是 2016 年的 \t apple \t 的第三行
- 从 2010 年开始,我是第 4 行的 \t 香蕉 \t
- 我是 1999 年的 \t 香蕉 \t 的第 5 行
解决方案
您在同一行上循环了太多次。请注意,您得到的结果都是您预期的 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))
推荐阅读
- javascript - JavaScript 运行时错误:“Microsoft”未定义 - Bing 地图版本 7
- angular - 如何使用angular2中的primeng在单击编辑按钮上为各个字段分配值
- angular - 路由器在 highcharts 中未定义
- android - Jenkins Mac Xamarin UI 测试失败
- ubuntu - KVM - 无法连接到管理程序错误
- c++ - 使用 MPI 在超立方体中广播
- c# - 从 DBPedia 服务获取信息
- vue.js - vue.js test-utils 为什么我的 onSubmit 函数 mock 没有被调用?
- python - 大型数据集上的 predict_on_batch() 内存错误
- javascript - Yargs 帮助不显示所有帮助选项