2012-03-28 5 views
26

は、どのように私は、「リストにない」エラーメッセージを無視することができますか?リストから要素を削除しようとすると、どのようにValueErrorを無視できますか? <code>x</code>がリスト<code>a</code>に存在しない場合、私は<code>a.remove(x)</code>を呼び出す場合

これが私の状況です:これを行うには

>>> 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

私は個人的に使用して検討したいです要素の順序が必ずしも重要でない限り、listの代わりにsetを使用してください。私は、次はもう少し簡単で読みやすいと思いとValueError

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

を無視する代わりに

>>> 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であるリストから最初の項目を削除します。これは、そのようなitem.'(http://docs.python.org/2/tutorial/datastructures.html)OPが存在しない場合にのみ内の有効な複製を示し、他のユースケースの最初の項目を削除する可能性のあるエラーでありますリスト。 – haventchecked

6

:: `を使用して

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

それは良い考えだが、@Niklas B.が指摘するように、彼は10でしか*キャッチ*例外が発生する可能性がありますされていないものを、どんなにので、「スレッドセーフ」です。この答えでは、 'if'条件がチェックされ、 '.remove() 'が呼び出される間に' a'から '10'が削除され、* uncaught * 'ValueError'となる可能性があります。 (あなたがA'何かによって変更されていない 'についての保証をすることができる場合は、これは大丈夫ですが、受け入れ答えとあなたもその可能性を考える必要はありません。)ラムダ式の場合 – tscizzle

+0

、それは時々することができ同じ目的のために1つのライナーを持っていると便利です。その場合、10のaと10のa.removeがその仕事をします。スレッドセーフでもありません。 – fuglede

+2

はちょっとあなたがスレッドの安全のために[パイソンの禅](https://www.python.org/dev/peps/pep-0020/を)放棄何をすべきかの時点で、この1 ...に引き裂かれましたか?確かに、マルチスレッドアプリケーションで使用される可能性の高いライブラリモジュールを作成している場合は、スレッドの安全性(またはその欠如)をより複雑にするか、文書化する必要がありますが、一般的にそうしようとするべきでしょうか? – reteptilian

関連する問題

 関連する問題