2012-11-07 29 views
82

Đoạn mã này được đem lại cho tôi một lỗi unhashable type: dict bất cứ ai có thể giải thích cho tôi giải phápLỗi Loại: unhashable loại: '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

Nó muốn được hữu ích để hiển thị các báo cáo lỗi vì vậy chúng tôi có thể nhìn thấy mà dòng có vấn đề ... – drevicko

Trả lời

139

Bạn đang cố gắng sử dụng một dict như một chìa khóa để dict khác là gì hoặc trong một số set. Điều đó không hoạt động vì các khóa phải được băm. Theo nguyên tắc chung, chỉ có các đối tượng bất biến (chuỗi, số nguyên, phao nổi, frozensets, tuples của bất biến) là hashable (mặc dù có thể có ngoại lệ). Vì vậy, điều này không hoạt động:

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

Để sử dụng dict làm khóa bạn cần biến nó thành thứ gì đó có thể được băm trước. Nếu dict bạn muốn sử dụng như chìa khóa bao gồm chỉ có giá trị bất biến, bạn có thể tạo ra một đại diện hashable của nó như thế này:

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

Bây giờ bạn có thể sử dụng key như một chìa khóa trong một dict hoặc set:

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

Tất nhiên bạn cần phải lặp lại các tập thể dục bất cứ khi nào bạn muốn tìm kiếm một cái gì đó sử dụng một dict:

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

Nếu 012.bạn muốn sử dụng như khóa có giá trị là bản thân dicts và/hoặc danh sách, bạn cần phải đệ quy "đóng băng" chìa khóa tiềm năng. Dưới đây là một điểm khởi đầu:

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

Cảm ơn, nó hoạt động, tuy nhiên vẫn nhận được lỗi nếu giá trị là một dict hoặc danh sách (unhashable), bây giờ tôi đang sử dụng băm (str (my_dict)), hoạt động tốt cho tôi. –

+2

chỉ là một lưu ý @StevenDu từ điển không đảm bảo trật tự, do đó, 'str (my_dict)' có thể trả về hai chuỗi khác nhau cho cùng một (hoặc khác nhau, nhưng tương đương) dicts –

Các vấn đề liên quan