2012-01-29 10 views
46

से सेट निकाल Built-In Types 5.7 Set Types के लिए अजगर 2.7.2 प्रलेखन मेरी व्याख्या के अनुसार, यह के लिए दस्तावेज़ से set.remove(elem) या set.discard(elem)अजगर सेट

के लिए एक पास करके सेट बी से सेट एक के तत्वों को दूर करने के संभव हो जाना चाहिए 2.7.2:

ध्यान दें, __contains__(), remove() करने ELEM तर्क, और discard() तरीकों एक सेट हो सकता है।

मैं इस व्याख्या का मतलब है कि मैं पारित कर सकते हैं एक setremove(elem) करने के लिए या discard(elem) और उन सभी तत्वों लक्ष्य सेट से निकाल दिया जाएगा। मैं इसे अजीब कुछ करने के लिए उपयोग करता हूं जैसे स्ट्रिंग या remove all common words from a word-frequency historam से सभी स्वरों को हटा दें। यहाँ परीक्षण कोड है:

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [M... 
Type "help", "copyright", "credits" or "license" 
>>> a = set(range(10)) 
>>> b = set(range(5,10)) 
>>> a 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b 
set([8, 9, 5, 6, 7]) 
>>> a.remove(b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: set([8, 9, 5, 6, 7]) 
>>> a.discard(b) 
>>> a 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> 

कौन सा मैं वापस जाने के लिए उम्मीद:

>>> a 
set([0, 1, 2, 3, 4]) 

मैं जानता हूँ कि मैं a.difference(b) जो एक नया सेट रिटर्न के साथ ऐसा कर सकते हैं; या set.difference_update(other) के साथ; या सेट ऑपरेटर a -= b के साथ, जो सेट इन-प्लेस को संशोधित करता है।

तो क्या यह दस्तावेज़ीकरण में एक बग है? क्या set.remove(elem) वास्तव में एक तर्क के रूप में सेट नहीं ले सकता है? या दस्तावेज सेट के सेट का संदर्भ देता है? यह देखते हुए कि difference_update मेरी व्याख्या पूरी करता है, मुझे लगता है कि मामला उत्तरार्द्ध है।

क्या यह अस्पष्ट नहीं है?

संपादित अतिरिक्त (कुछ पेशेवर) अजगर काम करते हैं, और हाल ही में इस सवाल का वापस खींचा जा रहा है के 3 साल के बाद, मैं अब एहसास क्या मैं वास्तव में क्या करने के लिए कोशिश कर रहा था के साथ पूरा किया जा सकता है:

>>> c = a.difference(b) 
set([0,1,2,3,4]) 

जो मैं मूल रूप से प्राप्त करने की कोशिश कर रहा था।

+2

मुझे प्यार है कि आप इतने सालों बाद इस पर वापस आए! +1 –

उत्तर

16

आपने पहले ही प्रश्न का उत्तर दिया है। यह सेट के सेट को संदर्भित करता है (वास्तव में फ्रोजनसेट युक्त सेट)। __contains को

ध्यान दें, ELEM तर्क __(),() हटाएं, और त्यागने() पद्धतियों एक सेट हो सकता है:

The paragraph you are referring to साथ शुरू होता है।

जिसका अर्थ है a.remove(b) में b एक सेट किया जा सकता है, और फिर जारी है साथ:

एक बराबर frozenset के लिए खोज का समर्थन करने के लिए, ELEM सेट अस्थायी रूप से खोज के दौरान उत्परिवर्तित है और फिर से बहाल । खोज के दौरान, elem set को पढ़ा या उत्परिवर्तित नहीं किया जाना चाहिए क्योंकि इसका अर्थपूर्ण मूल्य नहीं है।

कि अगर b एक सेट है, a.remove(b)a एक frozenset समकक्ष के लिए b को स्कैन करेगा और इसे हटाने के (या एक KeyError फेंक अगर यह मौजूद नहीं है) जिसका मतलब है।

+0

धन्यवाद! मेरी गलत व्याख्या को देखते हुए, दूसरी वाक्य ने ज्यादा समझ नहीं ली। इसे प्राथमिक उत्तर के रूप में चुनना क्योंकि यह मेरी प्राथमिक गलतफहमी को स्पष्ट करने में मदद करता है। लिंग का उदाहरण भी बहुत उपयोगी था। – cod3monk3y

1

मुझे लगता है कि प्रलेखन (जमे हुए) सेटों के सेट का जिक्र कर रहा है, हां।

+2

लेकिन आपके पास सेट का सेट नहीं हो सकता है; सेट हैशबल नहीं हैं। मुझे लगता है कि आप एक तत्व के रूप में एक फ्रोजनसेट के साथ एक सेट हो सकता है, मुझे लगता है। – DSM

+2

@DSM - इसलिए दस्तावेज कॉल के दौरान 'elem' मान को उत्परिवर्तित क्यों किया जाता है यह देखने के लिए कि समकक्ष' फ्रोजनसेट 'है या नहीं। – Amber

+0

आह, मैं देखता हूं। यह समझ आता है। +1। – DSM

7

आप अजगर में set के set रों नहीं हो सकता है के रूप में एक set परिवर्तनशील है। इसके बजाय, आपके पास setfrozenset एस हो सकता है। दूसरी ओर, आप के साथ __contains__(), remove(), और discard() पर कॉल कर सकते हैं। इस उदाहरण देखें:

a = set([frozenset([2])]) 
set([2]) in a  # you get True 
a.remove(set([2])) # a is now empty 

तो अपने प्रश्न का उत्तर है कि प्रलेखन frozenset के set रों की चर्चा करते हुए किया गया है।

+0

पाइथन दस्तावेज का एक अनैच्छिक रूप से अस्पष्ट हिस्सा, मेरे लिए क्या है, मेरे बारे में बहुत अच्छा संक्षिप्त उदाहरण है। धन्यवाद लिंग! – cod3monk3y

2

मैं पाइथन (मैक के लिए) के विभिन्न संस्करणों के लिए अंतर्निहित सहायता को देख रहा हूं। परिणाम यहां दिए गए हैं।

  • python2.5

निकालें (...)
एक सेट से एक तत्व निकालें; यह एक सदस्य होना चाहिए।
यदि तत्व सदस्य नहीं है, तो एक KeyError बढ़ाएं।

  • python2.6

निकालें (...)
एक सेट से एक तत्व निकालें; यह एक सदस्य होना चाहिए। यदि तत्व सदस्य नहीं है, तो एक KeyError बढ़ाएं।

  • python2.7

निकालें (...)
एक सेट से एक तत्व निकालें; यह एक सदस्य होना चाहिए। यदि तत्व सदस्य नहीं है, तो एक KeyError बढ़ाएं।

प्रलेखन आप पूर्ण में, का उल्लेख है, वास्तव में कहते हैं:

ध्यान दें, __contains__(), remove(), और discard() तरीकों के ELEM तर्क एक सेट हो सकता है। समकक्ष फ्रोजनसेट के लिए खोज का समर्थन करने के लिए, एटीएम सेट को खोज के दौरान अस्थायी रूप से उत्परिवर्तित किया जाता है और फिर बहाल किया जाता है।

यह एक फुटनोट लगता है, जो सुझाव देता है कि तर्क एक सेट हो सकता है, लेकिन जब तक यह सेट के भीतर एक मिलान करने वाला जमे हुए सेट नहीं मिलता है, तो इसे हटाया नहीं जाएगा। संशोधित सेट के बारे में उल्लेख यह है कि इसे एक मिलान किए गए जमे हुए सेट को देखने के लिए धोया जा सकता है।