如何在列表中存储累积输出?
我正在使用以下代码来计算文本中字母的频率:
for s in 'abcdefghijklmnopqrstuvwxyz ':
count = 0
for char in rawpunct.lower():
if s == char:
count +=1
result = s, '%.3f' % (count*100/len(rawpunct.lower()))
f_list.append(result)
结果是:
['0.061', '0.012', '0.017', '0.030', '0.093', '0.016', '0.016',
'0.049', '0.050', '0.001', '0.006', '0.034', '0.018', '0.052', '0.055',
'0.013', '0.001', '0.041', '0.050', '0.069', '0.021', '0.007', '0.017',
'0.001', '0.013', '0.000', '0.159']
但是我想要存储累积频率,也就是说我想创建这个列表:
['0.061', '0.073', '0.100', '0.130' ............ ]
有人知道该怎么做吗?
7 个回答
2
letters = 'abcdefghijklmnopqrstuvwxyz '
counts = dict.fromkeys(letters, 0)
for char in rawpunct.lower():
try:
counts[char] += 1
except KeyError:
pass
# this character in rawpunct should not be counted!
f_list = [0]
for s in letters:
f_list.append(f_list[-1] + counts[s])
str_list = ['{0:.3f}'.format(f) for f in f_list[1:]]
我的 f_list
是一个浮点数的列表(用浮点数计算总和比用它们的字符串表示更简单!)。最后我创建了 str_list
,这是这些浮点数的字符串表示列表。因为你不想让列表以零开头,所以最后会把零去掉(只取 f_list[1:]
)。
如果你的输入文本很长,这个方法会更快,因为它只读取一次。
3
你可以先用 import numpy
来引入一个叫做 NumPy 的库。接着,把结果变成一个数组,方法是 results=numpy.array(result)
。最后,你可以用 f_list=numpy.cumsum(results)
来计算这个数组的累积和。
2
只是为了好玩,写了这个一行代码:
original = ['0.061', '0.012', '0.017', '0.030', '0.093', '0.016', '0.016',
'0.049', '0.050', '0.001', '0.006', '0.034', '0.018', '0.052', '0.055',
'0.013', '0.001', '0.041', '0.050', '0.069', '0.021', '0.007', '0.017',
'0.001', '0.013', '0.000', '0.159']
result = [sum(float(item) for item in original[0:rank+1]) for rank in xrange(len(original))]
>>> [0.061, 0.073, 0.09, 0.12, 0.213, 0.22899999999999998, 0.245, 0.294, 0.344, 0.345, 0.351, 0.385, 0.403, 0.455, 0.51, 0.523, 0.524, 0.5650000000000001, 0.6150000000000001, 0.6840000000000002, 0.7050000000000002, 0.7120000000000002, 0.7290000000000002, 0.7300000000000002, 0.7430000000000002, 0.7430000000000002, 0.9020000000000002]