2011-12-23 9 views
12

यदि मेरे पास कोई ऑब्जेक्ट है जो पाइथन सेट के तत्व के बराबर तुलना करता है, लेकिन यह वही ऑब्जेक्ट नहीं है, तो सेट में ऑब्जेक्ट का संदर्भ प्राप्त करने का कोई उचित तरीका है? उपयोग केस डुप्लीकेट डेटा की पहचान और साझा करने के लिए सेट का उपयोग करेगा।एक समकक्ष वस्तु का उपयोग कर सेट के तत्व तक कैसे पहुंचे?

उदाहरण (अजगर 2.7):

>>> a = "This is a string" 
>>> b = "This is a string" 
>>> a is b 
False 
>>> a == b 
True 
>>> s = set((a,)) 
>>> b in s 
True 

कैसे b और s का उपयोग कर a के लिए एक संदर्भ पाने के लिए? मैं एक तरह से सोच सकता हूं, लेकिन मुझे यकीन नहीं है कि यह कार्यान्वयन-निर्भर नहीं है कि आपको a या b मिलते हैं या नहीं। संपादित करें: यह तब काम नहीं करता जब एस में एक से अधिक तत्व होते हैं; चौराहे काफी स्वाभाविक रूप से की तरह [x for x in smaller_set if x in larger_set]

>>> for x in set((b,)).intersection(s): c = x 
... 
>>> c is a 
True 

कुछ कार्यान्वित किया जाता है शायद एक अच्छी युक्ति सेट के बजाय, एक dict है जो अपने आप को प्रत्येक कुंजी के नक्शे का उपयोग करने के लिए होगा।

+2

यदि आपको दो बराबर, हैशबल ऑब्जेक्ट्स में से एक विशिष्ट की आवश्यकता है, तो ऐसा लगता है कि ऑब्जेक्ट बराबर और/या हैशबल नहीं होना चाहिए। आप इसकी आवश्यकता क्यों है? – delnan

+0

मुझे लगता है कि आपके संदेह उचित हैं: pypy 1.7.0 और ironpython 3.0 दोनों (कर सकते हैं) आपके अंतिम सी के लिए गलत है। – DSM

+0

मैं उसी ऑब्जेक्ट के संदर्भों के बराबर ऑब्जेक्ट के संदर्भों को बदलकर स्मृति को सहेज सकता हूं। –

उत्तर

3

मुझे पाइथन-सूची पर एक समान प्रश्न मिला: Get item from setget_equivalent(container, item) (Python recipe) के संदर्भ में एक चालाक उत्तर है।

चाल 'कुंजी' ऑब्जेक्ट के लिए एक रैपर ऑब्जेक्ट का निर्माण करना है, और जांचें कि in ऑपरेटर का उपयोग करके रैपर सेट में है या नहीं। यदि रैपर कुंजी के बराबर है, तो इसकी __eq__ विधि सेट में ऑब्जेक्ट तक पहुंच प्राप्त कर सकती है, और इसका संदर्भ सहेज सकती है। चर्चा से एक महत्वपूर्ण बात यह है कि सेट तत्वों की __eq__ विधि को NotImplemented को अपरिचित प्रकारों के लिए वापस करना होगा, अन्यथा रैपर का __eq__ कॉल नहीं किया जा सकता है।

1

आपका उपयोग केस लगता है जैसे यह शब्दकोश के लिए उपयोग का मामला है। कुंजी के रूप में, ऑब्जेक्ट की विशेषता जो "विदेशी" ऑब्जेक्ट के बराबर होती है, और वांछित ऑब्जेक्ट्स के मूल्यों के रूप में उपयोग करें।

यदि यह एक सरल उपयोग के मामले है, और आप एक रेखीय seartch हो सकता है, हालांकि, आप स्पष्ट कर सकता है - यह बुरा नहीं होगा:

def get_equal(in_set, in_element): 
    for element in in_set: 
     if element == in_element: 
      return element 
    return None 

आप की जरूरत है क्या पूछ आप वास्तव में क्या गिरफ्तारी के लिए (मैं इसके लिए कुछ उपयोग मामलों को लेकर आश्चर्यचकित कर सकता हूं) - wya जाने के लिए एक कस्टम डिक्शनरी क्लास बनाना है जिसमें इसके सदस्यों में से एक के रूप में सेट है, सदस्य सेट में प्रॉक्सी मेथथोड लागू करें, और दोनों शब्दकोश और सेट विधियों में, शब्दकोश और सेट सामग्री दोनों के सिंक रहता है। यह सही लागू करने के लिए समय लेने वाला होगा, लेकिन अपेक्षाकृत सीधा।

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