2016-04-25 105 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

非常感谢! –