python - 如何克服 TypeError: unhashable type: 'list' in this program
问题描述
我正在尝试计算频率表的平均值。
现在直到打印出平均值,一切正常,但之后我不断收到 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'
,我知道我无法将两个列表压缩在一起并比较每个元素,但我正在尝试解决问题。我想知道我是否在某个地方犯了错误。
解决方案
TypeError: unhashable type: <whatever>
当您尝试使用不可散列的东西作为散列索引数据结构中的键时,通常会发生这种情况(例如dict
, set
)。
查看您可能在哪里使用 list 作为哈希表索引,唯一可能这样做的部分是使用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
which 是dict
.
所以你只需要避免在mode
. 不知道为什么你首先要这样做,但如果你需要保持一个嵌套的可迭代,你可以用内部替换tuple
(注意:你以后将无法修改元组)。或者,尝试将您的数据扁平化为单个可迭代对象。
推荐阅读
- python - 两组重叠多边形的快速映射
- regex - 为什么这个正则表达式在 Python 中不匹配?
- python-3.x - 如何检查 Keras 后端功能是否正常工作?
- javascript - 如何覆盖 JavaScript 方法?
- reactjs - 无法通过 redux 获取 Firestore 数据
- java - 带有 ANSI Escape 序列和光标移动的 Java 扫描器在将光标移开和移回扫描器时显示 ^R
- c++ - 如何让代码读取不同的文件?
- javascript - 中断并重新启动 setTimeouts 循环
- python-3.x - 无法弄清楚条件
- python - 如果列表中的某个项目在python中有某个字符串,我该如何提取它?