2012-03-28 7 views

Antwort

24

Ein guten und Thread-sicheren Weg, dies nur zu tun ist, es zu versuchen und die Ausnahme zu ignorieren:

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

Ich persönlich betrachten würde mit set anstelle einer list solange die Reihenfolge Ihrer Elemente nicht unbedingt wichtig ist. Dann können Sie die Ablagemethode verwenden:

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

ein mit ' einstellen, wenn dies nicht der Fall ist, kann unbeabsichtigte Folgen haben. Aus der Dokumentation, [Entfernen Sie das erste Element aus der Liste, deren Wert x ist. Es ist ein Fehler, wenn es keinen solchen Gegenstand gibt.] (Http://docs.python.org/2/tutorial/datastructures.html) OP möchte vielleicht nur das erste Element in anderen Anwendungsfällen entfernen, um gültige Duplikate darin anzuzeigen Die Liste. – haventchecked

6

Als Alternative zu den Valueerror ignorieren

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

ich denke, die folgende ist ein wenig einfacher und lesbar:

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

Es ist ein guter Gedanke, aber @Niklas B. weist darauf hin, dass er "thread-safe" ist, denn egal was ist, 10 kann nicht immer nur eine * gefangen * Ausnahme verursachen. Während in dieser Antwort "10" von "a" zwischen der "if" Bedingung, die geprüft wird, und ".remove()", die aufgerufen wird, entfernt werden kann, was zu einem * uncaught * "ValueError" führt. (Wenn Sie eine Garantie geben können, dass 'a' durch nichts anderes geändert wird, dann ist das in Ordnung, aber mit der akzeptierten Antwort müssen Sie nicht einmal über diese Möglichkeit nachdenken.) – tscizzle

+0

Für Lambda-Ausdrücke kann es manchmal sein hilfreich, um einen Einliner für den gleichen Zweck zu haben, und in diesem Fall 'a in 10 und a.remove (10)' macht die Arbeit. Es ist aber auch nicht Thread-sicher. – fuglede

+2

Ein bisschen zerrissen an diesem ... an welchem ​​Punkt verlassst du das [zen Python] (https://www.python.org/dev/peps/pep-0020/) für Thread-Sicherheit? Sicherlich, wenn Sie ein Bibliotheksmodul schreiben, das wahrscheinlich in einer Multithread-Anwendung verwendet wird, müssen Sie die Dinge komplexer machen und/oder ihre Thread-Sicherheit (oder deren Fehlen) dokumentieren, aber sollte man das generell versuchen? – reteptilian

Verwandte Themen