2012-03-28 8 views

Odpowiedz

24

Dobrym i wątku bezpieczny sposób to zrobić, to po prostu spróbować i zignorować wyjątek:

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

bym osobiście rozważyć użycie set zamiast list, o ile kolejność elementów niekoniecznie jest ważna. Następnie można użyć metody usunąć:

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

Używanie ' zestaw "kiedy nie jest odpowiedni" może mieć niezamierzone konsekwencje. Z dokumentacji: [Usuń pierwszy element z listy o wartości x. Jest to błąd, jeśli nie ma takiego przedmiotu. "(Http://docs.python.org/2/tutorial/datastructures.html) OP może chcieć usunąć tylko pierwszy element w innych przypadkach użycia, wskazując prawidłowe duplikaty w ciągu Lista. – haventchecked

6

Jako alternatywę do ignorowania ValueError

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

myślę następujące jest trochę bardziej proste i czytelne:

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

To jest dobra myśl, ale jak wskazuje @Niklas B., jego jest "bezpieczna dla wątków", ponieważ bez względu na wszystko, 10 nieobecność może tylko spowodować wyjątek * złapany *. Podczas gdy w tej odpowiedzi "10" może zostać usunięte z 'a' między sprawdzanym warunkiem" if "i wywołanym' .remove() ', powodując * brak przechyłu *" ValueError ". (Jeśli możesz zrobić gwarancję, że 'a' nie zostanie zmodyfikowany przez nic innego, to jest to w porządku, ale z zaakceptowaną odpowiedzią nie musisz nawet myśleć o tej możliwości.) – tscizzle

+0

Dla wyrażeń lambda, może czasami być pomocny, aby mieć jednolinijkowy w tym samym celu, iw tym przypadku 'a na 10 i a.remove (10)' wykonuje pracę. Nie jest to również bezpieczne w obsłudze wątków. – fuglede

+2

Trochę rozdarty na tym ... w którym momencie porzucisz [zena pytona] (https://www.python.org/dev/peps/pep-0020/) dla bezpieczeństwa wątków? Oczywiście, jeśli piszesz moduł biblioteczny, który prawdopodobnie będzie używany w aplikacji wielowątkowej, będziesz musiał uczynić rzeczy bardziej złożonymi i/lub udokumentować ich bezpieczeństwo wątków (lub ich brak), ale czy należy spróbować tego zrobić w ogóle? – reteptilian

Powiązane problemy