如何计算python上字符之间的过渡频率?

时间:2019-02-13 03:22:10

标签: python-3.7

我创建了一个随机文本文件(我只是在记事本上随机输入了约3500个字符),我的代码必须读取输入的字符的频率并制作直方图-我已经完成了,但现在我需要我的代码读取字符之间的转换频率(例如,“ r”跟随“ a”的次数或空格跟随“ a”的次数),然后在图表或图表中显示。如何显示过渡或计算这些过渡的频率?

f = open('Text-File-HW2.txt', 'r')
data = f.read()
f.close()

range(len(data)) 
range(0, 5132)

d = {}
for i in range(len(data)):
    c = data[i]
    if c in d: 
        d[c] += 1
    else:
        d[c] = 1

d
{'s': 86,
 'j': 139,
 'k': 55,
 'm': 15,
 'f': 347,
 'n': 66,
 ' ': 569,
 'd': 69,
 'v': 83,
 'o': 48,
 'A': 2,
 'Q': 1,
 'H': 1,
 'P': 1,
 'E': 1,
 'J': 3,
 'R': 1,
 'N': 4,
 'V': 2,
 'F': 1,
 'L': 1,
 'I': 2,
 'O': 2,
 'D': 1,
 'S': 1,
 'i': 318,
 'r': 496,
 'e': 560,
 'a': 34,
 'w': 332,
 'h': 457,
 'b': 244,
 'c': 24,
 'g': 241,
 'u': 495,
 '9': 8,
 '3': 16,
 '4': 28,
 '8': 17,
 '5': 9,
 't': 63,
 'l': 7,
 ';': 1,
 'q': 41,
 'y': 223,
 'p': 7,
 '[': 1,
 '7': 9}

result = list(d.items())

result.sort()

result
[(' ', 569),
 ('3', 16),
 ('4', 28),
 ('5', 9),
 ('7', 9),
 ('8', 17),
 ('9', 8),
 (';', 1),
 ('A', 2),
 ('D', 1),
 ('E', 1),
 ('F', 1),
 ('H', 1),
 ('I', 2),
 ('J', 3),
 ('L', 1),
 ('N', 4),
 ('O', 2),
 ('P', 1),
 ('Q', 1),
 ('R', 1),
 ('S', 1),
 ('V', 2),
 ('[', 1),
 ('a', 34),
 ('b', 244),
 ('c', 24),
 ('d', 69),
 ('e', 560),
 ('f', 347),
 ('g', 241),
 ('h', 457),
 ('i', 318),
 ('j', 139),
 ('k', 55),
 ('l', 7),
 ('m', 15),
 ('n', 66),
 ('o', 48),
 ('p', 7),
 ('q', 41),
 ('r', 496),
 ('s', 86),
 ('t', 63),
 ('u', 495),
 ('v', 83),
 ('w', 332),
 ('y', 223)]

from pylab import * 

cs = [x[0] for x in result]
fs = [x[1] for x in result]

bar(cs, fs,)
<BarContainer object of 48 artists>


​

1 个答案:

答案 0 :(得分:1)

我认为这是最Python化的方式(假设您最后要使用dict

with open('Text-File-HW2.txt', 'r') as f:
    data = f.read()

d = dict(Counter(zip(data[:-1], data[1:])))

打破现状:

zip(data[:-1], data[1:])基本上会为您提供所有字母对的列表。

Counter(['aa', 'a ', ' a', 'aa')])会为您提供类似于Counter({'aa': 2, 'a ', 1: ' a': 1})的东西。