簡體   English   中英

如何克服 TypeError: unhashable type: 'list' in this program

[英]How to overcome 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'我知道我無法將 zip 兩個列表放在一起並比較每個元素,但我正在嘗試解決問題。 我想知道我是否在某個地方犯了錯誤。

TypeError: unhashable type: <whatever>通常在您嘗試使用不可散列的東西作為 hash 索引數據結構(例如dictset )中的鍵時發生。

查看您可能在哪里使用 list 作為 hash 表索引,唯一可能這樣做的部分是使用mode 通常使用 hash 表來計算頻率。 讓我們測試一下。

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'

是的,我們 go... mode使用collections.Counter這是一個dict

所以你只需要避免在mode中使用列表列表。 不知道為什么你首先要這樣做,但如果你需要保持一個嵌套的可迭代,你可以用tuple替換內部(注意:你以后將無法修改元組)。 或者,嘗試將您的數據扁平化為單個可迭代對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM