所以通过这个程序,我正在做一项任务,我已经正确地得到了这个列表的计数,平均值和中位数。我不知道如何正确地解决这个问题。但不幸的是,我一直在寻找一种不可用的类型:' 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'
>>>
答案 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
。