मामले में इस में मदद करता है ... यदि आप वाकई hashable समकक्ष में किसी कारण आप कुछ इस तरह कर सकते हैं के लिए unhashable चीजें बदलने की आवश्यकता:
from collections import Hashable, MutableSet, MutableSequence, MutableMapping
def make_hashdict(value):
"""
Inspired by https://stackoverflow.com/questions/1151658/python-hashable-dicts
- with the added bonus that it inherits from the dict type of value
so OrderedDict's maintain their order and other subclasses of dict() maintain their attributes
"""
map_type = type(value)
class HashableDict(map_type):
def __init__(self, *args, **kwargs):
super(HashableDict, self).__init__(*args, **kwargs)
def __hash__(self):
return hash(tuple(sorted(self.items())))
hashDict = HashableDict(value)
return hashDict
def make_hashable(value):
if not isinstance(value, Hashable):
if isinstance(value, MutableSet):
value = frozenset(value)
elif isinstance(value, MutableSequence):
value = tuple(value)
elif isinstance(value, MutableMapping):
value = make_hashdict(value)
return value
my_set = set()
my_set.add(make_hashable(['a', 'list']))
my_set.add(make_hashable({'a': 1, 'dict': 2}))
my_set.add(make_hashable({'a', 'new', 'set'}))
print my_set
मेरे HashableDict कार्यान्वयन सरल और कम से कम कठोर है उदाहरण here से। यदि आपको अधिक उन्नत हैशबल डिक्ट की आवश्यकता है जो पिकलिंग और अन्य चीजों का समर्थन करता है, तो कई अन्य कार्यान्वयन की जांच करें। उपरोक्त मेरे संस्करण में मैं मूल डॉट क्लास को संरक्षित करना चाहता था, इस प्रकार ऑर्डर्डडिक्ट के आदेश को संरक्षित करता था। मैं विशेषता-जैसी पहुंच के लिए here से AttrDict का भी उपयोग करता हूं।
ऊपर मेरा उदाहरण किसी भी तरह से आधिकारिक नहीं है, केवल एक ही समस्या के लिए मेरा समाधान जहां मुझे कुछ चीजों को एक सेट में स्टोर करने की आवश्यकता थी और उन्हें पहले "हैशिफी" करने की आवश्यकता थी।
कुछ भी जो अपरिवर्तनीय नहीं है आम तौर पर खराब कुंजी बनाता है। यदि आपको करना है तो आप टुपल्स का उपयोग कर सकते हैं। –