首页 > 解决方案 > 计算一个组合在日志中使用的次数

问题描述

我有以下形式的事件日志:

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

感谢大家的时间。

标签: python-3.x

解决方案


不要将每一行作为一个整体来计算,而是将每一行分成几对,然后计算每对的外观。

例如,不是单独计算('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

推荐阅读