2012-11-07 33 views
82

Bu kod parçası kimse başka dict için bir anahtar olarak bir dict kullanmaya çalışıyorsanızTypeError: unhashable türü: 'dict'

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

O kadar görebildiğimiz hata raporu göstermek için yararlı olurdu hangi satırın sorunu var ... – drevicko

cevap

139

çözüm ne olduğunu açıklayabilir bana bir hata unhashable type: dict veriyor veya set'da. Bu işe yaramaz çünkü anahtarlar yıkanabilir olmalı. Genel bir kural olarak, sadece değişmez nesneler (dizeler, tamsayılar, yüzer parçalar, frozensetler, değişmezlerin uzuvları) yıkanabilir (istisnalar olsa da). Yani bu işe yaramazsa:

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

ilk karma edilebilir bir şey haline çevirmek için gereken bir anahtar olarak bir dicti kullanın. Eğer anahtar olarak kullanmak istediğiniz dict sadece değişmez değerler oluşuyorsa, böyle bunun bir hashable temsilini oluşturabilirsiniz:

:

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

Artık bir dict veya set bir anahtar olarak key kullanabilir

>>> 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 

ise: Eğer bir dict kullanarak bir şeyler aramak istediğinizde tabii

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

egzersize tekrarlamak zorundaanahtar olarak kullanmak istediğiniz kendi değerleri dikte ve/veya listeler var, olası anahtarı yinelemeli "dondurmak" gerekir. İşte başlangıç ​​noktası:

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

Teşekkürler, ama yine de bir dict veya liste (inkar edilemez) bir değer varsa, hata alır, şimdi hash (str (my_dict)) kullanıyorum, benim için iyi çalışıyor. –

+2

sadece bir not @StevenDu sözlükleri emri garanti etmez, bu yüzden str (my_dict) 'aynı (veya farklı fakat eşdeğer) dicts için iki farklı dizge döndürür –

İlgili konular