2014-04-27 83 views
1

下面是我試圖完成的任務。我有一個包含大量單詞的.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 

每當我for循環(i的值表),然後通過總和除以EA元件,印刷列表返回爲[0,0,0,0, 0,0,0,0,0,0,0,0,0,0。我很難過。

回答

2

的問題都可以在這裏:

y_axis += [int(i)/summ] 

劃分兩個整數resturns整數,在這裏你得到四捨五入真正的結果出來。

只要其中一個數字是例如浮動,你會得到浮動結果。

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

是這個工作!一個簡單的單詞如何使整個程序複雜化已經很瘋狂了。如果我有15個代表,我會投票。謝謝。 – user3521614

2

它們返回爲0的原因是因爲Python使用整數除法。使用float可以獲得更直觀的結果。

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

In [2]: float(1)/5 
Out[2]: 0.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