2015-11-20 46 views
0

所以通過這個程序,我正在做一個任務,我已經正確地計算了這個列表的數量,平均值和中位數。我不知道如何正確解決這個問題。但不幸的是,我不斷得到一個'難以置信的類型:'列表''任何幫助模式?確定列表模式

#! /usr/bin/env python3 

class StatsList: 
    def __init__(self): 
     self.sum = 0 
     self.nums = [] 

    def append(self, number): 
     self.nums.append(number) 

    def count(self): 
     count = len(self.nums) 
     return count 

    def mean(self): 
     for num in self.nums: 
      self.sum = self.sum + num 

     return self.sum /len(self.nums) 

    def median(self): 
     self.nums.sort() 
     midPos = self.count() // 2 

     if self.count() % 2 == 0: 
      median = (nums[midPos] + nums[midPos-1])/2.0 
     else: 
      median = self.nums[midPos] 

     return median 

    def mode(self): 
     counts= {} 
     for num in self.nums: 
      counts[num] = counts.get(self.nums,0) + 1 
     items = list(counts.nums()) 
     self.nums.sort(key=byFreq) 

def byFreq(pair): 
    return pair[1] 

def main(): 
    l = StatsList() 
    l.append(1) 
    l.append(11) 
    l.append(3) 
    l.append(1) 
    l.append(4) 

    print("Count:", l.count()) # should print 5 
    print("Mean:", l.mean()) # should print 4.0 
    print("Median:", l.median()) # should print 3 
    print("Mode:", l.mode()) # should print 1 

if __name__ == '__main__': 
    main() 

輸出/回溯:

Count: 5 
Mean: 4.0 
Median: 3 
Traceback (most recent call last): 
    File "C:\Users\Dorthyy\Downloads\statslist.py", line 63, in <module> 
    main() 
    File "C:\Users\Dorthyy\Downloads\statslist.py", line 59, in main 
print("Mode:", l.mode()) # should print 1 
    File "C:\Users\Dorthyy\Downloads\statslist.py", line 39, in mode 
    counts[num] = counts.get(self.nums,0) + 1 
TypeError: unhashable type: 'list' 
>>> 
+0

你可以包括完整的追溯? – TigerhawkT3

+0

@ TigerhawkT3我已經包括它 – Dorthy

回答

2

self.nums是存儲所有號碼的list。您不能從字典中獲得get(),因爲list不能用作字典密鑰。您需要從循環迭代中獲得的實際數字。而不是counts.get(self.nums, 0),請使用counts.get(num, 0)

這應該修復錯誤的其餘部分在該方法中:

def mode(self): 
    counts= {} 
    for num in self.nums: 
     counts[num] = counts.get(num, 0) + 1 
    mode = max(counts, key=counts.get) 
    return '{} appeared {} times'.format(mode, counts[mode]) 

模式就是具有最大值的關鍵,因此它更清晰,以獲得該字典的max(),由值(這意味着根本不需要byFreq方法)。然後你返回一個很好格式的字符串,其模式和出現的次數。

+0

出於某種原因,我仍然收到這個說「字典」對象有沒有屬性「民」 – Dorthy

+0

嘗試'項目的()''而不是NUMS()'的錯誤。 – TigerhawkT3

+0

現在我得到了模式,但它告訴我,沒有模式。當模式應該是1. – Dorthy

0

要初始化算作一本字典,並試圖以一個列表中指定的鍵,它的字典。 self.nums是一個列表。這就是爲什麼你得到

TypeError: unhashable type: 'list'

試試這個代碼。

from collections import OrderedDict 

def mode(self): 
    counts= OrderedDict() 
    for num in self.nums: 
     counts[num] = counts.get(num,0) + 1 
    return counts.items()[0][0] 

注意到,我在這裏初始化算作OrderedDict(),將存儲在有序地元素,以便以後進行循環,你只需要返回ordereddict的第一要素。和inside for循環,我將self.nums中的單個元素指定爲該ordereddict的關鍵字。 希望它有幫助。

旁邊的說明。如果您想獲得4.0作爲l.mean()的答案,則需要在返回值之前將返回值乘以1.0