按列表总和划分列表元素并将其放回列表中

时间:2014-04-27 23:15:37

标签: python list dictionary

这是我想要完成的事情的主旨。我有一个包含大量单词的.txt文件(dict.txt)。我的任务是计算.txt文件中每个字母的频率并将其放入列表中,将每个元素转换为百分比(将ea元素除以100),然后将该列表用作我的条形图的y_axis。

到目前为止,我已经创建了一个字典,其中包含每个字母表作为键,值等于该字母出现在.txt文件中的总次数。我被困住的地方是将每个值除以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

每当我循环(i在value_list中)然后将ea元素除以总和,打印列表返回为[0,0,0,0,0,0,0,0,0,0,0,0, 0,0]。我很难过。

3 个答案:

答案 0 :(得分:2)

它们返回0的原因是因为Python使用整数除法。使用float可以获得更直观的结果。

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

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

答案 1 :(得分:2)

问题可以在这里:

y_axis += [int(i) / summ]

除以两个整数重新生成整数,在这里你可以得到实际结果。

只要其中一个数字是例如浮动,你会得到漂浮的结果。

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

答案 2 :(得分: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()

产生类似的东西:

enter image description here