2013-05-14 6 views
28

मेरे पास एक सेट myset है, और मेरे पास एक ऐसा फ़ंक्शन है जो इसके आइटम पर कुछ ऑपरेशन करने के लिए इसे सक्रिय करता है और यह ऑपरेशन आखिरकार आइटम को सेट से हटा देता है।इसे सेट करते समय सेट से आइटम हटाएं

जाहिर है, मैं इसे मूल सेट पर फिर से चलाने के दौरान नहीं कर सकता। हालांकि, मैं यह कर सकता हूं:

mylist = list(myset) 
for item in mylist: 
    # do sth 

क्या कोई बेहतर तरीका है?

while myset: 
    item = myset.pop() 
    # do something 

या, यदि आप सशर्त आइटम हटाने की जरूरत:

+2

आपरेशन करता है * हमेशा * आइटम को हटाने, या केवल कभी कभी? यदि आप हमेशा आइटम को हटाते हैं, तो पुनरावृत्ति पूर्ण होने के बाद बस सेट को खाली करना आसान हो सकता है। – Blckknght

उत्तर

14

सबसे पहले, एक सेट, के रूप में शून्य Piraeus ने हमें बताया, आप कर सकते हैं

का उपयोग कर
myset = set([3,4,5,6,2]) 
while myset: 
    myset.pop() 
    print myset 

मैंने इन आउटपुट

01 को एक प्रिंट विधि जोड़ा
>>> 
set([3, 4, 5, 6]) 
set([4, 5, 6]) 
set([5, 6]) 
set([6]) 
set([]) 

यदि आप किसी सूची के लिए अपनी पसंद के साथ रहना चाहते हैं, तो मेरा सुझाव है कि आप सूची सूची का उपयोग करके सूची की गहरी प्रतिलिपि बनाते हैं, और मूल सूची से वस्तुओं को हटाते समय प्रतिलिपि पर लूप करते हैं। मेरे उदाहरण में, मैं प्रत्येक लूप पर मूल सूची की कमी की लंबाई बना देता हूं।

l = list(myset) 
l_copy = [x for x in l] 
for k in l_copy: 
    l = l[1:] 
    print l 

देता

>>> 
[3, 4, 5, 6] 
[4, 5, 6] 
[5, 6] 
[6] 
[] 
9

यह काम करना चाहिए

def test(item): 
    return item != "foo" # or whatever 

myset = set(filter(test, myset)) 
+1

यह ठीक काम करता है अगर मैं बस सेट से सबकुछ हटाना चाहता हूं। मेरे मामले में, मुझे प्रत्येक आइटम को पकड़ने की आवश्यकता है, और सेट से इसे हटाने से पहले ** इसमें एक फ़ंक्शन लागू करें। – skyork

+0

@skyork पुनरावृत्तियों से आइटम्स को हटाने के रूप में आप उन पर फिर से प्रयास करना एक बुरा विचार है (खराब है कि पाइथन अपवाद उठाएगा यदि यह काम करता है कि आप क्या कर रहे हैं)। आप एक नया सेट बनाने और फिर पुराने को दूर फेंकने के बेहतर हैं। –

+2

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

4

वर्तमान सेट को संशोधित करते हुए सभी भी संख्या प्रदान करते हैं।

myset = set(range(1,5)) 
myset = filter(lambda x:x%2==0, myset) 
print myset 

वापसी करेंगे

>>> [2, 4] 

अगर कोई अवसर उपयोग हमेशाlambda का उपयोग यह आपके जीवन आसान हो जाएगा है।

+3

मैं एजी नहीं हूं ree कि 'lambda' हमेशा आपके जीवन को आसान बनाता है ... दरअसल, ऐसा लगता है कि यह आमतौर पर आपके जीवन को आसान बना देता है। । । – mgilson

1

"जाहिर है, मैं इसे मूल सेट पर फिर से चलाने के दौरान नहीं कर सकता।"

मुझे यकीन नहीं है कि यह सच है ... जब मैंने कोशिश की तो मुझे "सहमति" त्रुटियों की उम्मीद थी, लेकिन ऐसा कोई प्रतीत नहीं हुआ। रिकॉर्ड कोड के लिए मैं दिखता उपयोग कर रहा हूँ इस तरह:

for member in myset: 
    myset.remove(member) 

("सदस्य" सेट के लिए चर नाम का एक बेहतर विकल्प है, "तत्व" सूचियों के लिए)

आह ... बस देखा ज़ीरो पी के उत्तर के तहत दयालु टिप्पणी: स्पष्ट रूप से दयालु एक विशेषज्ञ है जहां मैं एक बंबलर हूं, लेकिन मैं अपना जवाब किसी भी तरह से ध्यान में रखूंगा ...

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

इसलिए यह प्रकट होता कि विलोपन-while-बार दोहराना के लिए घृणा अन्य भाषाओं में खराब कार्यान्वित संरचनाओं से बुरे अनुभव से अंधविश्वास और/या hangovers की बात है।

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

तो ऊपर के लिए कोड का एक बराबर सा है:

while myset: 
    member = myset.pop() 
    # do something 
+3

जब मैं पहली विधि का उपयोग करता हूं, तो मुझे पाइथन 2.7 और 3.5 (और दूसरी विधि सेट खाली हो जाती है) में 'रनटाइम त्रुटि: पुनरावृत्ति के दौरान आकार बदलना' मिलता है। – Mark

2

एक और तरीका हो सकता है:

s=set() 
s.add(1) 
s.add(2) 
s.add(3) 
s.add(4) 
while len(s)>0: 
    v=next(iter(s)) 
    s.remove(v) 
+0

मुझे समझ में नहीं आता कि यह सवाल का जवाब देने का प्रयास कैसे करता है? – Carpetsmoker

+0

अब समझ में आता है: डी .. संपादन करते समय अंतिम कनेक्शन। –

+0

यह मूल रूप से @ शून्य-पीरियस सुझाव के समान ही धीमा है। – SleepProgger

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