आप समानता के लिए वस्तुओं की तुलना करने के लिए कैसे परिभाषित करने के लिए एक __eq__
समारोह लिखने के लिए की जरूरत है। यदि आप सॉर्ट करना चाहते हैं, तो आपके पास __cmp__
फ़ंक्शन होना चाहिए, और __cmp__
के संदर्भ में __eq__
को लागू करने का सबसे अधिक अर्थ है।
def __eq__(self, other):
return cmp(self, other) == 0
आप शायद भी __hash__
को लागू करना चाहिए, और आप निश्चित रूप से आप एक सेट या शब्दकोश में अपनी वस्तुओं डाल करने के लिए योजना बनानी चाहिए अगर।ऑब्जेक्ट्स के लिए डिफ़ॉल्ट __hash__
आईडी() है, जो प्रभावी रूप से सभी ऑब्जेक्ट्स अद्वितीय बनाता है (यानी विशिष्टता ऑब्जेक्ट सामग्री पर आधारित नहीं है)।
मैंने कक्षा के लिए बेस क्लास/इंटरफ़ेस लिखा है जो इस प्रकार की समानता तुलना करता है। आप इसे उपयोगी पाते हो सकता है:
class Comparable(object):
def attrs(self):
raise Exception("Must be implemented in concrete sub-class!")
def __values(self):
return (getattr(self, attr) for attr in self.attrs())
def __hash__(self):
return reduce(lambda x, y: 37 * x + hash(y), self.__values(), 0)
def __cmp__(self, other):
for s, o in zip(self.__values(), other.__values()):
c = cmp(s, o)
if c:
return c
return 0
def __eq__(self, other):
return cmp(self, other) == 0
def __lt__(self, other):
return cmp(self, other) < 0
def __gt__(self, other):
return cmp(self, other) > 0
if __name__ == '__main__':
class Foo(Comparable):
def __init__(self, x, y):
self.x = x
self.y = y
def attrs(self):
return ('x', 'y')
def __str__(self):
return "Foo[%d,%d]" % (self.x, self.y)
def foo_iter(x):
for i in range(x):
for j in range(x):
yield Foo(i, j)
for a in foo_iter(4):
for b in foo_iter(4):
if a<b: print "%(a)s < %(b)s" % locals()
if a==b: print "%(a)s == %(b)s" % locals()
if a>b: print "%(a)s > %(b)s" % locals()
व्युत्पन्न वर्ग attrs()
कि एक टपल या ऑब्जेक्ट की विशेषताओं (अर्थात् अपरिवर्तनीय विशेषताओं है कि यह यह क्या है बनाने के) अपनी पहचान के लिए योगदान की सूची देता है को लागू करना चाहिए। सबसे महत्वपूर्ण बात यह है कि कोड समानता को सही ढंग से संभालता है जहां कई विशेषताएं हैं, और यह पुराना स्कूल कोड है जिसे अक्सर गलत तरीके से किया जाता है।
मुझे लगता है कि उनकी समस्या वस्तु समानता है, इतना खोज नहीं है :) – extraneon
ओपी में वस्तुओं की सूचियां हैं, परमाणु प्रकार की सूचियां नहीं हैं। यदि आप उन ऑब्जेक्ट्स के साथ अपना कोड आज़माते हैं जिनके पास '__hash__' परिभाषित नहीं है, तो यह काम नहीं करेगा, जैसे ओपी का कोड ऑब्जेक्ट्स की सूचियों के साथ काम नहीं करता है जिसके लिए कोई '__eq__' या' __cmp__' परिभाषित नहीं है। – hughdbrown