将列表元素除以列表总和并放回列表中
我想做的事情大概就是这样。我有一个文本文件(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)]