2012-03-28 36 views
26

अगर मैं a.remove(x) पर कॉल करता हूं तो में पर कॉल करने पर मैं "सूची में नहीं" त्रुटि संदेश को अनदेखा कैसे कर सकता हूं?जब मैं किसी सूची से तत्व निकालने का प्रयास करता हूं तो मैं ValueError को कैसे अनदेखा कर सकता हूं?

>>> a = range(10) 
>>> a 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> a.remove(10) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: list.remove(x): x not in list 
>>> a.remove(9) 

उत्तर

24

यह सिर्फ यह कोशिश करते हैं और अपवाद की अनदेखी करने के लिए है करने के लिए एक अच्छा और धागे की सुरक्षित तरीका:

try: 
    a.remove(10) 
except ValueError: 
    pass # do nothing! 
17

मैं व्यक्तिगत रूप से एक प्रयोग करने पर विचार होता

यह मेरी स्थिति है setlist के बजाय जब तक आपके तत्वों का क्रम जरूरी नहीं है। तो फिर तुम छोड़ें विधि का उपयोग कर सकते हैं: ValueError अनदेखी करने के लिए एक विकल्प के रूप

>>> S = set(range(10)) 
>>> S 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> S.remove(10) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 10 
>>> S.discard(10) 
>>> S 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
+0

एक का उपयोग करते हुए ' सेट करें जब उचित नहीं हो तो अनपेक्षित परिणाम हो सकते हैं। प्रलेखन से, ['सूची से पहले आइटम को हटाएं जिसका मान x है। यदि कोई ऐसी वस्तु नहीं है तो यह एक त्रुटि है। '] (Http://docs.python.org/2/tutorial/datastructures.html) ओपी केवल अन्य उपयोग मामलों में पहले आइटम को हटाना चाहता है, जो वैध डुप्लिकेट को इंगित करता है सूचि। – haventchecked

6

try: 
    a.remove(10) 
except ValueError: 
    pass # do nothing! 

मुझे लगता है कि निम्नलिखित एक छोटे से अधिक सरल और पठनीय है:

if 10 in a: 
    a.remove(10) 
+4

यह एक अच्छा विचार है, लेकिन जैसा कि @ निकलास बी बताता है, उसका "थ्रेड-सुरक्षित" है, क्योंकि इससे कोई फर्क नहीं पड़ता, 10 वहां कभी नहीं होने पर * पकड़ा * अपवाद हो सकता है। जबकि इस जवाब में, 'if' की स्थिति की जांच की जा रही है और '.remove()' कहा जा रहा है, जिसके परिणामस्वरूप' '' '' '' '' को हटाया जा सकता है, जिसके परिणामस्वरूप * uncaught * 'ValueError' है। (यदि आप किसी अन्य चीज़ द्वारा संशोधित नहीं होने के बारे में गारंटी दे सकते हैं, तो यह ठीक है, लेकिन स्वीकृत उत्तर के साथ आपको उस संभावना के बारे में भी सोचना नहीं है।) – tscizzle

+0

लैम्ब्डा अभिव्यक्तियों के लिए, कभी-कभी एक ही उद्देश्य के लिए एक लाइनर रखने में सहायक, और उस स्थिति में '10 में से एक और एक .remove (10) 'नौकरी करता है। हालांकि यह थ्रेड-सुरक्षित भी नहीं है। – fuglede

+2

किंडा इस पर फेंक दिया ... थ्रेड सुरक्षा के लिए आप किस बिंदु पर [पायथन के ज़ेन] (https://www.python.org/dev/peps/pep-0020/) को छोड़ देते हैं? निश्चित रूप से यदि आप एक लाइब्रेरी मॉड्यूल लिख रहे हैं जिसका उपयोग मल्टीथ्रेड किए गए ऐप में किया जा सकता है तो आपको चीजों को और अधिक जटिल बनाने और/या इसकी थ्रेड सुरक्षा (या इसकी कमी) दस्तावेज करने की आवश्यकता होगी, लेकिन क्या इसे सामान्य रूप से करने की कोशिश करनी चाहिए? – reteptilian

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

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