2016-04-25 103 views
1

我有詞作爲鍵和整數作爲值的字典。它輸出作爲這樣:編寫的標準偏差函數

print (word_ratings_dict) 
{'hate': [1, 2, 2, 1, 1, 3, 0, 2, 3, 2, 0, 4, 1, 1], 'joy': [3, 4, 3, 3, 2, 4, 1]} 

對於字典中的每個關鍵詞,我需要計算其標準偏差,而無需使用統計模塊。

繼承人是我到目前爲止有:

def menu_validate(prompt, min_val, max_val): 
    """ produces a prompt, gets input, validates the input and returns a value. """ 
    while True: 
     try: 
      menu = int(input(prompt)) 
      if menu >= min_val and menu <= max_val: 
       return menu 
       break 
      elif menu.lower == "quit" or menu.lower == "q": 
       quit() 
      print("You must enter a number value from {} to {}.".format(min_val, max_val)) 
     except ValueError: 
      print("You must enter a number value from {} to {}.".format(min_val, max_val)) 

def open_file(prompt): 
    """ opens a file """ 
    while True: 
     try: 
      file_name = str(input(prompt)) 
      if ".txt" in file_name: 
       input_file = open(file_name, 'r') 
       return input_file 
      else: 
       input_file = open(file_name+".txt", 'r') 
       return input_file 
     except FileNotFoundError: 
      print("You must enter a valid file name. Make sure the file you would like to open is in this programs root folder.") 

def make_list(file): 
    lst = [] 
    for line in file: 
     lst2 = line.split(' ') 
     del lst2[-1] 
     lst.append(lst2) 
    return lst 

def rating_list(lst): 
    '''iterates through a list of lists and appends the first value in each list to a second list''' 
    rating_list = [] 
    for list in lst: 
     rating_list.append(list[0]) 
    return rating_list 

def word_cnt(lst, word : str): 
    cnt = 0 
    for list in lst: 
     for word in list: 
      cnt += 1 
    return cnt 

def words_list(file): 
    lst = [] 
    for word in file: 
     lst.append(word) 
    return lst 

def word_rating(word, ratings_lst): 
    '''finds ratings for a word and appends them to a dictionary of words''' 
    lst = [] 
    for line in ratings_lst: 
     line = line.split() 
     if word in line: 
      rating = line[0] 
      lst.append(int(rating)) 
    return lst 
cnt_list = [] 
while True: 
    menu = menu_validate("1. Get sentiment for all words in a file? \nQ. Quit \n", 1, 1) 
    if menu == True: 
     ratings_file = open("sample.txt") 
     ratings_list = make_list(ratings_file) 
     word_ratings_dict = {} 
     word_avg_dict = {} 
     std_dev_dict = {} 
     word_file = open_file("Enter the name of the file with words to score \n") 
     word_list = words_list(word_file) 


     for word in word_list: 
      #counts the words 
      cnt = word_cnt(ratings_list, word) 

      cnt_dict[word] = cnt 

      word_ratings_dict[word] = word_rating(word, ratings_list) 

      total_rating = 0 

      for i in range (0, cnt): 
       total_rating += word_ratings_dict[word][i] 

      word_avg_dict[word] = total_rating/cnt 

      std_dev_dict[word] = 
+0

即使你不想'進口statistics',在[模塊代碼(HTTPS ://hg.python.org/cpython/file/3.5/Lib/statistics.py)是開源的。您始終可以閱讀該模塊的功能。無論如何,「統計」有什麼問題? – ChrisP

+1

這是一個任務,教官明確表示我們不能使用統計模塊。 –

回答

2

這將做的工作很好:

def mean(data): 
    return float(sum(data)/len(data)) 

def variance(data): 
    mu = mean(data) 
    return mean([(x - mu) ** 2 for x in data]) 

def stddev(data): 
    return sqrt(variance(data)) 
+0

非常感謝! –