1. 程式人生 > >Python初學者之TypeError: unhashable type: 'list'問題分析

Python初學者之TypeError: unhashable type: 'list'問題分析

使用Python實現機器學習k-近鄰演算法,建立資料集和標籤時,出現了“TypeError: unhashable type: 'list'”錯誤,無法正確打印出group和labels。

1、錯誤程式碼與錯誤資訊

具體程式碼例項如下:

from numpy import *
import operator

def creatDataSet():
    group = {[[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]}
    labels = {'A', 'A', 'B', 'B'}
    return group, labels

print(group)
print(labels)

出現的錯誤如下:

2、錯誤原因分析

經過一番搜尋和排查,發現:原來是hash錯誤。

list 不使用 hash 值進行索引,故其對所儲存元素沒有可雜湊的要求;set / dict 使用 hash 值進行索引,也即其要求欲儲存的元素有可雜湊的要求。Python不支援dict的key為list或dict型別,因為list和dict型別是unhashable(不可雜湊)的。

>>> set([[], [], []])
TypeError: unhashable type: 'list'
>>> set([{}, {}, {}])
TypeError: unhashable type: 'dict'
>>> set([set(), set(), set()])
TypeError: unhashable type: 'set'

3、修改後程式碼與正確輸出

經過排查,發現賦值的括號用錯了,最外層不應使用大括號“{ }”,group應使用小括號“()”,labels應使用中括號“[ ]”,程式碼修改如下:

from numpy import *
import operator

def creatDataSet():
    group = ([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    print(group)
    print(labels)
    return group, labels

creatDataSet()

正確結果輸出: