【问题标题】:How to overcome TypeError: unhashable type: 'list' in this program如何克服 TypeError: unhashable type: 'list' in this program
【发布时间】:2021-07-26 03:47:12
【问题描述】:

我正在尝试计算频率表的平均值。

现在直到打印出平均值,一切正常,但之后我不断收到 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' 我知道我无法将两个列表压缩在一起并比较每个元素,但我正在尝试解决问题。我想知道我是否在某个地方犯了错误。

【问题讨论】:

  • 你能粘贴整个回溯吗?
  • 为什么ModeList 是一个列表而不是一个列表?
  • 请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。这段代码不是最小的。此外,它挂起等待输入——不要指望我们输入测试数据或构建测试文件。相反,只需硬编码导致问题的测试用例。

标签: python list typeerror


【解决方案1】:

TypeError: unhashable type: <whatever> 通常发生在您尝试使用不可散列的东西作为散列索引数据结构中的键时(例如dictset)。

看看你可能在哪里使用列表作为哈希表索引,唯一可能这样做的部分是使用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 替换内部(注意:之后你将无法修改元组)。或者,尝试将数据扁平化为单个可迭代对象。

【讨论】:

  • 谢谢你,帮助我。 - 互联网上的一个随机陌生人
  • 不客气。如果有帮助,如果您可以投票/标记为最佳答案,那就太好了:)
猜你喜欢
  • 2012-11-20
  • 2023-02-05
  • 2012-11-07
  • 2015-02-11
  • 1970-01-01
  • 2019-10-11
  • 2020-03-27
  • 2020-05-11
相关资源
最近更新 更多