2012-03-28 11 views

Respuesta

24

una manera buena y segura para los subprocesos de hacer esto es a modo de prueba y pasar por alto la excepción:

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

yo personalmente consideraría el uso de una set en lugar de list, siempre que el orden de los elementos no sea necesariamente importante. A continuación, puede utilizar el método de descarte:

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

El uso de un ' set' cuando no es apropiado puede tener consecuencias no deseadas. De la documentación, ['Elimine el primer elemento de la lista cuyo valor sea x. Es un error si no existe dicho elemento.]] (Http://docs.python.org/2/tutorial/datastructures.html) OP puede querer eliminar solo el primer elemento en otros casos de uso, indicando duplicados válidos dentro de la lista. – haventchecked

6

Como alternativa a ignorar la ValueError

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

Creo que el siguiente es un poco más sencillo y fácil de leer:

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

Es una buena idea, pero como lo señala @Niklas B., el suyo es "seguro para subprocesos", porque no importa qué, 10 no estar allí solo puede causar una excepción * atrapada *. Mientras que en esta respuesta, '10' podría eliminarse de' a' entre la condición 'if' que está siendo marcada y' .remove() 'siendo llamado, resultando en * uncaught *' ValueError'. (Si puede hacer una garantía acerca de que 'a' no sea modificado por otra cosa, entonces está bien, pero con la respuesta aceptada ni siquiera tiene que pensar en esa posibilidad). – tscizzle

+0

Para expresiones lambda, a veces puede ser útil para tener una línea para el mismo propósito, y en ese caso 'a en 10 y a.remove (10)' hace el trabajo. Aunque tampoco es seguro para subprocesos. – fuglede

+2

Un poco desgarrado en este ... ¿en qué punto abandonas el [zen de python] (https://www.python.org/dev/peps/pep-0020/) para seguridad de hilos? Ciertamente, si está escribiendo un módulo de biblioteca que probablemente se utilizará en una aplicación de subprocesos múltiples, necesitará hacer las cosas más complejas y/o documentar su seguridad de subprocesos (o la falta de ellos), pero ¿debería tratarse de hacer eso en general? – reteptilian

Cuestiones relacionadas