首页 > 解决方案 > 如何克服 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',我知道我无法将两个列表压缩在一起并比较每个元素,但我正在尝试解决问题。我想知道我是否在某个地方犯了错误。

标签: pythonlisttypeerror

解决方案


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.Counterwhich 是dict.

所以你只需要避免在mode. 不知道为什么你首先要这样做,但如果你需要保持一个嵌套的可迭代,你可以用内部替换tuple(注意:你以后将无法修改元组)。或者,尝试将您的数据扁平化为单个可迭代对象。


推荐阅读