我正在尝试计算频率表的平均值。
现在,在打印平均值之前,一切正常,但在那之后我不断收到 TypeError: unhashable type: 'list'
直到这里程序正常:
import threading
import statistics
from statistics import mode
import numpy as np
print("Instructions:Enter a number than press ENTER until when fully completed")
ScoresNumber=[]
n = int(input("Entering amount of scores you want : "))
for i in range(0, n):
ele = int(input())
ScoresNumber.append(ele)
print("These are the scores for the Frequency table",ScoresNumber)
print("\n")
print("Now enter Frequency")
FrequencyNumber=[]
a = int(input("Entering amount of frequencies you want : "))
for i in range(0, a):
ele = int(input())
FrequencyNumber.append(ele)
print("These are the frequencies for the Frequency table",FrequencyNumber)
SumFrequencyNumber=sum(FrequencyNumber)
print("Sum of elements in frequency is :",SumFrequencyNumber)
print("\n")
print ("Now calculating FX wait....")
FX=[a * b for a, b in zip(FrequencyNumber,ScoresNumber)]
print("Calculated,This is the FX:",FX)
print("\n")
SumFX=sum(FX)
print("Sum of elements in FX is :",SumFX)
print("\n")
print("Final Output")
Mean=SumFX/SumFrequencyNumber
print("Mean is:",Mean)
问题发生的点:
def most_common(b):
return(mode(b))
ModeList=[[item for item, count in zip(ScoresNumber,FrequencyNumber) for i in range(count)]]
b=(ModeList)
print(most_common(b))
ScoresNumber.sort()
b=(ScoresNumber[-1])
c=(ScoresNumber[0])
Range=b-c
print("Range is:",Range)
整个程序:
import threading
import statistics
from statistics import mode
import numpy as np
print("Instructions:Enter a number than press ENTER until when fully completed")
ScoresNumber=[]
n = int(input("Entering amount of scores you want : "))
for i in range(0, n):
ele = int(input())
ScoresNumber.append(ele)
print("These are the scores for the Frequency table",ScoresNumber)
print("\n")
print("Now enter Frequency")
FrequencyNumber=[]
a = int(input("Entering amount of frequencies you want : "))
for i in range(0, a):
ele = int(input())
FrequencyNumber.append(ele)
print("These are the frequencies for the Frequency table",FrequencyNumber)
SumFrequencyNumber=sum(FrequencyNumber)
print("Sum of elements in frequency is :",SumFrequencyNumber)
print("\n")
print ("Now calculating FX wait....")
FX=[a * b for a, b in zip(FrequencyNumber,ScoresNumber)]
print("Calculated,This is the FX:",FX)
print("\n")
SumFX=sum(FX)
print("Sum of elements in FX is :",SumFX)
print("\n")
print("Final Output")
Mean=SumFX/SumFrequencyNumber
print("Mean is:",Mean)
def most_common(b):
return(mode(b))
ModeList=[[item for item, count in zip(ScoresNumber,FrequencyNumber) for i in range(count)]]
b=(ModeList)
print(most_common(b))
ScoresNumber.sort()
b=(ScoresNumber[-1])
c=(ScoresNumber[0])
Range=b-c
print("Range is:",Range)
我不断收到错误 TypeError: unhashable type: 'list'
我知道我无法将两个列表压缩在一起并比较每个元素,但我正在尝试解决问题。我想知道我是否在某个地方犯了错误。
答案 0 :(得分:0)
TypeError: unhashable type: <whatever>
通常发生在您尝试使用不可散列的对象作为散列索引数据结构(例如 dict
、set
)中的键时。
看看您可能在哪里使用列表作为哈希表索引,唯一可能做到的部分是使用 mode
。计算频率通常使用哈希表完成。让我们测试一下。
In [1]: from statistics import mode
In [2]: mode([1,1,2])
Out[2]: 1
In [3]: mode([[1,1,2]])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-23d99259e845> in <module>
----> 1 mode([[1,1,2]])
/usr/lib/python3.8/statistics.py in mode(data)
556 """
557 data = iter(data)
--> 558 pairs = Counter(data).most_common(1)
559 try:
560 return pairs[0][0]
/usr/lib/python3.8/collections/__init__.py in __init__(self, iterable, **kwds)
550 '''
551 super(Counter, self).__init__()
--> 552 self.update(iterable, **kwds)
553
554 def __missing__(self, key):
/usr/lib/python3.8/collections/__init__.py in update(self, iterable, **kwds)
635 super(Counter, self).update(iterable) # fast path when counter is empty
636 else:
--> 637 _count_elements(self, iterable)
638 if kwds:
639 self.update(kwds)
TypeError: unhashable type: 'list'
是的,我们开始...... mode
使用 collections.Counter
,它是一个 dict
。
所以你只需要避免在 mode
中使用列表列表。不知道为什么你首先要这样做,但如果你需要保持嵌套的可迭代性,你可以用 tuple
替换内部(注意:之后你将无法修改元组)。或者,尝试将数据展平为单个可迭代对象。