确定列表的模式

时间:2015-11-20 02:26:01

标签: python statsmodels

所以通过这个程序,我正在做一项任务,我已经正确地得到了这个列表的计数,平均值和中位数。我不知道如何正确地解决这个问题。但不幸的是,我一直在寻找一种不可用的类型:' list'''有关模式的任何帮助吗?

#! /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'
 >>> 

2 个答案:

答案 0 :(得分: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方法)。然后返回一个格式很好的字符串,其中包含模式和出现的次数。

答案 1 :(得分:0)

您正在将计数初始化为字典并尝试将LIST指定为该字典的键。 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(),它将以排序方式存储元素,因此在for循环之后,您只需要返回ordereddict的第一个元素。在for循环中,我将self.nums中的单个元素指定为该ordereddict的键。 希望它有所帮助。

在旁注。如果您希望获得4.0作为l.mean()的答案,则需要在返回之前将返回值乘以1.0