2012-11-07 14 views
82

コードのこの作品は、誰もがあなたが別のdictへの鍵としてdictを使用しようとしているTypeError例外:非ハッシュタイプ:「辞書」

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

ソリューションが何であるかを私に説明することができ、私にエラーunhashable type: dictを与えていますまたはsetにあります。それはキーがハッシュ可能でなければならないので機能しません。一般的な規則として、不変なオブジェクト(文字列、整数、浮動小数点数、frozensets、immutablesのタプル)のみがハッシュ可能です(例外は可能です)。これはうまくいきません:

dictをキーとして使用するには、最初にハッシュされるものにする必要があります。

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

今、あなたはdictsetでキーとしてkeyを使用できます:

キーとして使用したい辞書のみ不変の値で構成されている場合、あなたはこのようなことのハッシュ可能な表現を作成することができます
>>> 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 

をあなたがキーとして使用したいのは、それ自体がディクテーションやリストです。将来のキーを再帰的に「フリーズ」する必要があります。ここでは出発点です:私たちが見ることができるように

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

値はdictまたはリスト(unhashable)で、今はハッシュ(str(my_dict))を使用しています。 –

+2

ちょうどメモ@StevenDu辞書は順序を保証しないので、 'str(my_dict)'は同じ(または異なるが同等の)dictsに対して2つの異なる文字列を返すことができます –

関連する問題