2012-11-07 124 views
82

這段代碼是給我一個錯誤unhashable type: dict任何人都可以給我解釋一下什麼是類型錯誤:unhashable類型:「字典」

negids = movie_reviews.fileids('neg') 
def word_feats(words): 
    return dict([(word, True) for word in words]) 

negfeats = [(word_feats(movie_reviews.words(fileids=[f])), 'neg') for f in negids] 
stopset = set(stopwords.words('english')) 

def stopword_filtered_word_feats(words): 
    return dict([(word, True) for word in words if word not in stopset]) 

result=stopword_filtered_word_feats(negfeats) 
+2

RTD http://docs.python.org/2.7/library/stdtypes.html#mapping-types-dict – iMom0

+0

這將會是有益的顯示錯誤報告,所以我們可以看到哪一行有問題... – drevicko

回答

139

你試圖使用dict作爲重點另一個dict解決方案或在set。這不起作用,因爲密鑰必須是可散列的。作爲一般規則,只有不可變對象(字符串,整數,浮點數,frozensets,不可變元組)是可散列的(儘管例外是可能的)。所以這是行不通的:

>>> dict_key = {"a": "b"} 
>>> some_dict[dict_key] = True 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'dict' 

要使用一個字典作爲一個關鍵你需要把它變成可能首先被哈希的東西。如果你想爲重點使用字典只包含不變的值,你可以創建它的一個哈希的表現是這樣的:

>>> key = frozenset(dict_key.items()) 

現在你可以使用key作爲一個dictset的關鍵:

>>> some_dict[key] = True 
>>> some_dict 
{frozenset([('a', 'b')]): True} 

當然,你需要重複練習,每當你想使用字典查找的東西:

>>> some_dict[dict_key]      # Doesn't work 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'dict' 
>>> some_dict[frozenset(dict_key.items())] # Works 
True 

如果dict你希望使用作爲關鍵字的值本身就是字典和/或列表,你需要遞歸地「凍結」預期的關鍵字。這裏有一個出發點:

def freeze(d): 
    if isinstance(d, dict): 
     return frozenset((key, freeze(value)) for key, value in d.items()) 
    elif isinstance(d, list): 
     return tuple(freeze(value) for value in d) 
    return d 
+1

謝謝,它的工作原理,但如果值是字典或列表(不可能),現在我使用散列(str(my_dict)),但仍然會出錯,對我來說工作正常。 –

+2

只是一個說明@StevenDu字典不能保證順序,所以'str(my_dict)'可以爲同一個(或不同但相同的)字符串返回兩個不同的字符串 –

相關問題