2010-03-28 16 views
25

मेरे पास ऑब्जेक्ट्स की एक सूची है जिसे मैं एक सेट में बदलना चाहता हूं। मेरी वस्तुओं में कुछ फ़ील्ड हैं जिनमें से कुछ o.id और o.area हैं। मैं चाहता हूं कि दो ऑब्जेक्ट बराबर हों यदि ये दो फ़ील्ड समान हैं। यानी: o1==o2 यदि और केवल o1.area==o2.area and o1.id==o2.id है।पायथन: सेट कैसे काम करते हैं

मैंने __eq__ और __cmp__ पर लिखने की कोशिश की लेकिन मुझे त्रुटि मिली: TypeError: unhashable instance

मुझे क्या लिखना चाहिए?

+3

http://docs.python.org/library/stdtypes.html#set-types-set-frozenset और http://docs.python.org/glossary.html#term-hashable –

उत्तर

38

आईडी और क्षेत्र फ़ील्ड के आधार पर एक सार्थक हैश वापस करने के लिए __hash__ विधि को परिभाषित करें। उदा .:

def __hash__(self): 
    return hash(self.id)^hash(self.area) 
+13

मैं थोड़ा सा हूँ इस तरह कुछ पर bitwise गणित की लीरी। मैं कुछ का उपयोग करूंगा = वापसी हैश ((self.id, self.area)) =। –

+1

दो समान घटकों को परेशान करते समय यह एक समस्या होने की संभावना है। उदाहरण के लिए हैश (x)^हैश (वाई) गलत व्यवहार करेगा यदि swapped अक्ष के साथ जोड़ी समन्वय सामान्य है। इस मामले में, समस्याओं का कारण बनने की संभावना बहुत कम है क्योंकि यह सहसंबंधित हैश के साथ चींटियों और तारों को उत्पन्न करना असंभव है। ऐसा कहकर, आपका सुझाव अभी भी एक अच्छा है, जो मैं चाहता हूं कि मैंने सोचा :-)। –

9

"टाइप एरर: अप्रत्याशित उदाहरण।" त्रुटि शायद पुरानी शैली वर्ग परिभाषा यानी की वजह से है .:

class A: 
    pass 

नई बजाय शैली का प्रयोग करें:

class A(object): 
    pass 

आप __cmp__ समारोह को ओवरराइड यदि आप चाहिए सेटों में अपने वस्तु का उपयोग कर के लिए ओवरराइड __hash__। दूसरे मामले में हैश सभी ऑब्जेक्ट उदाहरणों को असमान मानता है और __cmp__ फ़ंक्शन कभी नहीं कहा जाएगा।

संबंधित मुद्दे