如何在列表中存储累积输出?

1 投票
7 回答
2371 浏览
提问于 2025-04-17 08:51

我正在使用以下代码来计算文本中字母的频率:

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]

撰写回答