প্রকারের ত্রুটি: অনিবার্য ধরন: 'ডিক'


175

এই কোডের টুকরটি আমাকে একটি ত্রুটি দিচ্ছে unhashable type: 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)


3
ত্রুটি প্রতিবেদনটি দেখাতে দরকারী হবে যাতে কোন লাইনটিতে সমস্যা রয়েছে তা আমরা দেখতে পারি ...
ড্রেভিকো

উত্তর:


248

আপনি dictঅন্যের চাবি হিসাবে dictবা এ- তে ব্যবহার করার চেষ্টা করছেন set। এটি কার্যকর হয় না কারণ কীগুলি হ্যাশেবল হতে হবে। একটি সাধারণ নিয়ম হিসাবে, কেবলমাত্র অপরিবর্তনীয় অবজেক্ট (স্ট্রিং, ইন্টিজার্স, ফ্লোটস, ফ্রোজেনসেটস, অপরিশোধনের টিপলস) ধাবনযোগ্য (যদিও ব্যতিক্রমগুলি সম্ভব)। সুতরাং এটি কাজ করে না:

>>> 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কী dictবা set: তে কী হিসাবে ব্যবহার করতে পারেন

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

2
ধন্যবাদ, এটি কাজ করে, তবুও ত্রুটিটি পাওয়া যায় যদি মানটি ডিক বা তালিকার (অপরিবর্তনীয়) হয়, এখন আমি হ্যাশ (টিআর (আমার_ডিক্ট)) ব্যবহার করছি, আমার পক্ষে ভাল কাজ করে।
স্টিভেন ডু

7
@ স্টিভেনডু অভিধানের একটি নোটই আদেশের গ্যারান্টি দেয় না, সুতরাং str(my_dict)একই (বা পৃথক, তবে সমতুল্য) বিলিগুলির জন্য দুটি পৃথক স্ট্রিং ফিরে আসতে পারে
কে রাফেল

1
ফলস্বরূপ হিমশীতল ডেকে রূপান্তর করতে, কেবল কল করুন dict(the_frozenset)
ব্যবহারকারী

4
আমার কাছে মনে হয় frozenset(dict_key.items())এটি একই বিষয়বস্তুযুক্ত দুটি ডিক্টগুলিতে সম্ভাব্য সমস্যাযুক্ত তবে পৃথক সন্নিবেশ ক্রমের ফলে একই কী কী হতে পারে না। সাজানো () এ একটি কল যুক্ত করা ক্রম মনে হচ্ছে। উদাহরণস্বরূপ frozenset(sorted(dict_key.items())), ফ্রিজেসেন্টটি একটি বিজোড় পছন্দ মতো বলে মনে হয় যা সেটগুলি সুস্পষ্টভাবে নিরস্ত থাকে। এটি সম্ভবত অনুশীলনে খুব ভাল কাজ করে তবে টিপল আমার কাছে আরও যুক্তিযুক্ত পছন্দ বলে মনে হয়। আমি গিয়েছিলামtuple(sorted(dict_key.items()))
জেসন হেইস

@ জেসনহিস
ইউজার 3732361

6

একটি সম্ভাব্য সমাধান হতে পারে জেএসওএন ডাম্পস () পদ্ধতিটি ব্যবহার করা, যাতে আপনি অভিধানটিকে স্ট্রিংয়ে রূপান্তর করতে পারেন ---

import json

a={"a":10, "b":20}
b={"b":20, "a":10}
c = [json.dumps(a), json.dumps(b)]


set(c)
json.dumps(a) in c

আউটপুট -

set(['{"a": 10, "b": 20}'])
True

2
এটা হওয়া উচিত dumps, না dump
কুশন গুণসেকের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.