python-3.x - 计算一个组合在日志中使用的次数
问题描述
我有以下形式的事件日志:
A B C D
A B C D
A B C D
A B C D
D E F G
D E F G
D E F G
D E F G
D E F G
D E F G
D E F G
A D E F G
D E F G
A D E G
我正在尝试计算例如多少次的频率A -> B
。使用下面的代码,我计算每个跟踪的频率。
from collections import Counter
flog = []
input_file ="test.txt"
with open(input_file, "r") as f:
for line in f.readlines():
line = line.split()
flog.append(line)
trace_frequency= map(tuple,flog)
flog=list(Counter(trace_frequency).items())
这给了我:
(('A', 'B', 'C', 'D'), 4)
(('D', 'E', 'F', 'G'), 8)
(('A', 'D', 'E', 'F', 'G'), 1)
(('A', 'D', 'E', 'G'), 1)
所以我的问题是我怎样才能从上面转到我计算所有日志实例到波纹管格式的格式:
A B 4
B C 4
C D 4
A D 2
D E 10...etc
感谢大家的时间。
解决方案
不要将每一行作为一个整体来计算,而是将每一行分成几对,然后计算每对的外观。
例如,不是单独计算('A', 'B', 'C', 'D'
) ,而是分别计算('A', 'B')
, ('B', 'C')
, ('C', 'D')
。
from collections import Counter
flog = []
input_file = "test.txt"
with open(input_file, "r") as f:
for line in f.readlines():
line = line.split()
flog.extend(line[i: i + 2] for i in range(len(line) - 1))
# ^ note extend instead of append
trace_frequency = map(tuple, flog)
flog = list(Counter(trace_frequency).items())
flog
就是现在
[(('A', 'B'), 4), (('B', 'C'), 4), (('C', 'D'), 4), (('D', 'E'), 10),
(('E', 'F'), 9), (('F', 'G'), 9), (('A', 'D'), 2), (('E', 'G'), 1)]
要获得所需的格式(带有订单奖励),您可以使用:
flog = Counter(trace_frequency)
for entry, count in flog.most_common():
print(' '.join(entry), count)
输出
D E 10
E F 9
F G 9
A B 4
B C 4
C D 4
A D 2
E G 1
推荐阅读
- python - 按列分组后如何获取最高频率元素?
- .net - .net core - 工作单元通用存储库模式
- delphi - Delphi 属性编辑器,如 Delphi 中 TValueListEditor(或其他组件)处理的可折叠复合值
- python - Flask 包装器无法在发布请求上成功重定向
- javascript - React:何时将函数用作子函数以及何时使用组件
- laravel - thie laravel 安装宅基地,流浪失败
- katalon-studio - katalon 中的 utf-8 字符处理
- php - 如何为我的编码一起减小图像大小和调整图像大小?
- r - Shinyalert 响应问题
- javascript - 如何在数据网格的列标题和行中动态添加复选框?