2012-06-17 9 views
6

का उपयोग करें सदस्यों का कहना है कि मेरे पास कस्टम ऑब्जेक्ट्स का सेट myset है जो उनके बराबर हो सकता है हालांकि उनके संदर्भ अलग हैं (a == b and a is not b)। अब अगर मैं सेट में add(a) सेट करता हूं, तो पायथन सही ढंग से a in myset and b in myset मानता है भले ही सेट में केवल len(myset) == 1 ऑब्जेक्ट है।पायथन: सेट

यह स्पष्ट है। लेकिन क्या अब का उपयोग करके सेट से किसी भी तरह a के मूल्य को निकालना संभव है? मान लीजिए कि ऑब्जेक्ट्स म्यूटेबल हैं और मैं उन्हें दोनों को बदलना चाहता हूं, a के प्रत्यक्ष संदर्भ को भूल गए हैं। अलग-अलग रखें, मैं myset[b] ऑपरेशन की तलाश में हूं, जो सेट के सदस्य a को वापस कर देगा।

ऐसा लगता है कि set यह नहीं कर सकता है (इसके सभी सदस्यों के माध्यम से तेज़ होने से तेज़)। यदि हां, तो कम से कम एक प्रभावी काम है?

+0

तुम क्यों यह करने के लिए की जरूरत है? यदि आपके पास पहले से 'बी' है, तो आपको' ए' की आवश्यकता क्यों है, जो बराबर है? –

+0

यह एक बदसूरत आवश्यकता है ... –

+0

@ करलकेनटेल: सेट के अंदर तत्व कहीं और (गहरी संरचना के अंदर से) से संदर्भित है और मैं इसका मूल्य बदलना चाहता हूं। वस्तुएं मूल रूप से 2 डी वेक्टर प्रकार के हैं, और वे उत्परिवर्तनीय हैं। – emu

उत्तर

5

मुझे नहीं लगता कि set ओ (1) समय में किसी आइटम को पुनर्प्राप्त करने का समर्थन करता है, लेकिन आप इसके बजाय dict का उपयोग कर सकते हैं।

d = {} 
d[a] = a 
retrieved_a = d[b] 
+0

असल में मैंने इसके साथ टूल किया और थोड़ी देर पहले स्रोत को देखा, और आईआईआरसी, चौराहे की तलाश करते समय cpython हमेशा छोटे सेट पर फिर से चला जाता है। तो आपके पास क्या काम है, लेकिन यदि 's' लंबा है, तो यह' b' वापस आ जाएगा। – senderle

+0

@sendle: मुझे लगता है कि आप सही हैं - [सेट के लिए स्रोत] (http://svn.python.org/projects/python/trunk/Objects/setobject.c)।फिर मेरा दूसरा दृष्टिकोण विफल रहता है, इसलिए मैं इसे हटा रहा हूं। इस पर ध्यान दिलाने के लिए धन्यवाद। –

0

आप केवल myset और b है, तो उस नजरिए से, आप a के लिए उपयोग, क्योंकि यह वहाँ नहीं है नहीं होगा। यदि आप एकाधिक म्यूटेबल ऑब्जेक्ट्स बनाते हैं और उनमें से एक को myset पर जोड़ते हैं तो अन्य myset या आपके द्वारा जोड़े गए ऑब्जेक्ट से निपटने पर अन्य 'ज्ञात' नहीं होते हैं।

यदि आप a और b संशोधित करना चाहते हैं तो आपको कहीं और ऑब्जेक्ट्स का ट्रैक रखना होगा।

0

हो सकता है कि यह:

(myset - (myset - set([b]))).pop() is a 
+0

यह काम करता है, लेकिन सेट अंतर (अर्थात् पहला वाला) शायद पाइथन को सभी तत्वों को एक-एक करके हटाने की आवश्यकता है। इसके कारण, यह सेट के माध्यम से पुनरावृत्ति के रूप में एक ही धीमी गति से है। – emu

+0

@emu: शायद, हालांकि मुझे लगता है कि किनारे के मामलों के लिए कुछ अनुकूलन हो सकते हैं। वैसे भी, मुझे डर है कि यह donts या रैखिक खोज का उपयोग किए बिना _only_ सेट का उपयोग करने का एकमात्र तरीका है। – georg

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