将列表元素除以列表总和并放回列表中

1 投票
3 回答
1652 浏览
提问于 2025-04-18 04:31

我想做的事情大概就是这样。我有一个文本文件(dict.txt),里面有很多单词。我的任务是计算这个文件中每个字母出现的频率,然后把这些频率放到一个列表里,再把每个元素转换成百分比(也就是每个元素除以100),最后用这个列表作为我柱状图的y轴。

到目前为止,我已经创建了一个字典,字典的每个字母作为键,对应的值就是这个字母在文本文件中出现的总次数。现在我遇到的问题是,如何把每个值除以100,然后把这个新数字放到一个列表里,以便用作我图表的y轴,而x轴就是字母本身。

这是我已经写好的代码:

letter_dict = {}
word_list = []
filename = raw_input('Enter filename: ')
new_file = open(filename).readlines() 

for i in new_file:
    word = i.strip().lower()
    word_list += list(word)

for letter in word_list:
    if letter in letter_dict:
        letter_dict[letter] += 1
    else:
        letter_dict[letter] = 1
x_axis = []
y_axis = []

summ= 0
for i in letter_dict.values(): #sum of all values in list
    summ += i

value_list = list(letter_dict.values())

for k in letter_dict:
    x_axis += [k]
print summ
y_axis = []
num_avg = []
for i in value_list:

    y_axis += [int(i) / summ]



create_plot(x_axis, y_axis, filename) #this is for my "plot" function

每当我用for循环(i in value_list)去除以每个元素的总和时,打印出来的列表总是返回[0,0,0,0,0,0,0,0,0,0,0,0,0,0]。我真是搞不懂了。

3 个回答

0

这是一个改写后的版本:

# Assumes Python 2.7
from collections import Counter
import matplotlib.pyplot as plt
from string import ascii_lowercase

def get_file():
    fname = raw_input("Enter the file name: ")
    with open(fname) as inf:
        return inf.read()

def count_letters(s):
    chars = Counter(s.lower())
    return {ch:chars[ch] for ch in ascii_lowercase}

def plot_letters(count):
    total = sum(count.values())
    xs = range(len(ascii_lowercase))
    ys = [count[ch] * 100. / total for ch in ascii_lowercase]
    plt.bar(xs, ys)
    plt.xticks([x+0.5 for x in xs], ascii_lowercase)
    plt.show()

def main():
    letters = get_file()
    count = count_letters(letters)
    plot_letters(count)

main()

它会生成类似这样的东西:

在这里输入图片描述

2

它们返回0的原因是因为Python使用的是整数除法。要想得到更直观的结果,可以使用浮点数。

In [1]: 1/5
Out[1]: 0

In [2]: float(1)/5
Out[2]: 0.2
2

问题可能出在这里:

y_axis += [int(i) / summ]

把两个整数相除时,结果会是整数,这样你得到的结果就会是四舍五入后的整数。

如果其中一个数字是小数,比如说浮点数,那么你得到的结果就是小数。

y_axis += [int(i) / float(summ)]

撰写回答