python - 创建字典以计算 txt 文件中每组的值
问题描述
这可能很容易实现,但我可以找到一个好的实现。我正在尝试对 txt 文件中不同组的值求和。假设我们有一个文件,其中每一行如下:
------------------------
Blank line
class 1
value 10
------------------------
Blank line
class 2
value 20
------------------------
Blank line
class 1
value 15
------------------------
Blank line
class 1
value 20
------------------------
Blank line
class 2
value 10
我正在考虑创建一个字典,将类设置为键,并将每个键的值总和设置为字典值。例如,输出应该是:
my_dict = {'class 1': 45, 'class 2': 30}
. 我之前对数据集进行了检查,并意识到当然有 500 个不同的类具有不同的值总和。我的第一个目的是为此目的使用字典,但不知道是否是最好的方法。我所做的是为有类的每一行创建一个字典,但是这样我就有了很多字典,其中一些重复了。但是我可以通过使用来总结它们,Counter fucntion from Collenctions
但这绝对不是最好的方法。有什么建议吗?
解决方案
使用正则表达式和 a defaultdict
:
import re
from collections import defaultdict
dct = defaultdict(int)
with open('test.txt') as f:
data = re.findall(r'(class\s\d+).*\nvalue\s(\d+)', f.read())
for k, v in data:
dct[k] += int(v)
print(dct)
输出:
defaultdict(<class 'int'>, {'class1': 45, 'class2': 30})
您可以查看正则表达式:(class\s\d+).*\nvalue\s(\d+)
我必须添加,.*
因为您输入中的某些行末尾有随机空格。如果那是复制错误,则您不需要它。
推荐阅读
- postgresql - 重写 pl/pgSQL 函数
- r - 使用样本创建多个训练、验证、测试拆分
- android - 将带有过滤器的 SVG 转换为 Android Vector Drawable
- angular - mat-autocomplete 不使用 observable 过滤
- vue.js - 如何从 url vue 中删除 /#/
- c# - 使用 DataReceivedEventHandler 函数中的字符串更新主窗体的文本框控件?
- flutter - 侦听错误的 Flutter Provider,但仍然收到错误“setState() 或 markNeedsBuild() 在构建期间调用。”
- javascript - 检查 discord.js 机器人权限
- javascript - 如何将 API 数据获取到单独的 HTML 页面
- c# - 如何使用 LINQ 对包含当前数据的特定列求和