मुझे लगता है कि आप इसमें शामिल कुछ सूक्ष्मताओं का एहसास नहीं कर सकते हैं। पहली समस्या यह है कि एक आदेश में वस्तुओं को प्रकट करने का आदेश कार्यान्वयन द्वारा परिभाषित नहीं किया जाता है। इसका मतलब है कि बस एक dict काम नहीं करता है की str
के लिए पूछ रहा है, क्योंकि आप
str(d1) == "{'a':1, 'b':2}"
str(d2) == "{'b':2, 'a':1}"
हो सकता था और इन विभिन्न मूल्यों के हैश होगा। आप dict में केवल hashable आइटम नहीं हैं, तो आप उन्हें हैश सकते हैं और फिर अपने हैश शामिल, @Bart करता है या बस
hash(tuple(sorted(hash(x) for x in d.items())))
नोट sorted
के रूप में है, क्योंकि आप यह सुनिश्चित करें कि टुकड़ों में बंटी टपल में बाहर आता है उसी क्रम के बावजूद वस्तुओं को आदेश में कौन सा आदेश दिखाई देता है। यदि आपके पास तानाशाही में डिक्ट्स हैं, तो आप इसे पुनः प्राप्त कर सकते हैं, लेकिन यह जटिल होगा।
लेकिन यह इस तरह किसी भी कार्यान्वयन को तोड़ने के लिए यदि आप शब्दकोश में मनमाना डेटा की अनुमति के लिए आसान हो सकता है के बाद से आप बस एक टूटी हुई __hash__
कार्यान्वयन के साथ एक वस्तु लिख सकते हैं और है कि का उपयोग कर सकते हैं। और आप id
का उपयोग नहीं कर सकते हैं, क्योंकि तब आपके पास समान आइटम हो सकते हैं जो अलग-अलग तुलना करते हैं।
कहानी का नैतिक यह है कि एक कारण के लिए पाइथन में हैशिंग डाइट्स समर्थित नहीं है।
अपने dict में क्या है? अगर यह सिर्फ तार है (कहें) तो आप बस क्रमबद्ध स्ट्रिंग का प्रतिनिधित्व कर सकते हैं: 'हैश (repr (sorted (my_dict.items()))'। – katrielalex
अमूर्त डेटा क्या है? Dict-hash एल्गोरिदम की स्थिरता और कार्यशीलता इस बात पर निर्भर करती है कि यह किस डेटा पर है। उदाहरण के लिए, यदि आपके पास डिक्ट्स का एक नियम है तो क्या होगा? – katrielalex
ये डेटा प्रकार: http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html – sahid