Dado:
a = [[1,2],[3,4],[5,6],[7,8]] b = 3
Me gustaría eliminar un elemento de a
que tenga b
como primer elemento. Entonces en este caso eliminaríamos [3,4]
para dar:
a = [[1,2],[5,6],[7,8]]
Mi código actual es:
if b in [i[0] for i in a]: pos = [i[0] for i in a].index(b) del a[pos]
Esto funciona pero es lento. ¿Cuál sería una mejor manera de hacer esto?
EDITAR: no he probado el rendimiento antes, así que puedo estar haciendo esto mal, pero me sale esto:
def fun1(): lst = [[x, 2*x] for x in range(1000000)] lst = [x for x in lst if x[0] != 500] return lst def fun2(): lst = [[x, 2*x] for x in range(1000000)] for i in reversed(range(len(lst))): if lst[i][0] == 500: del lst[i] return lst cProfile.runctx('fun1()', None, locals()) 6 function calls in 0.460 seconds cProfile.runctx('fun2()', None, locals()) 6 function calls in 0.502 seconds
Invertir eliminar a
, modificándolo en el lugar:
for i in reversed(range(len(a))): if a[i][0] == 3: del a[i]
Una modificación en el lugar significa que esto es más eficiente, ya que no crea una nueva lista (como lo haría una lista de comprensión).
Como OP solicita una solución de rendimiento, aquí hay una comparación timeit
entre las dos respuestas más votadas aquí.
Preparar –
a = np.random.choice(4, (100000, 2)).tolist() print(a[:5]) [[2, 1], [2, 2], [3, 2], [3, 3], [3, 1]]
Lista de comprensión –
%timeit [x for x in a if x[0] != b] 11.1 ms ± 685 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Borrar hacia atrás
%%timeit for i in reversed(range(len(a))): if a[i][0] == 3: del a[i] 10.1 ms ± 146 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
Están realmente cerca, pero la eliminación inversa tiene un 1UP en el rendimiento porque no tiene que generar una nueva lista en la memoria, como lo haría la lista de comprensión.
Puede utilizar una lista de comprensión:
>>> a = [[1,2],[3,4],[5,6],[7,8]] >>> b = 3 >>> a = [x for x in a if x[0] != b] >>> a [[1, 2], [5, 6], [7, 8]]
for i in a[:-1]: if i[0]==b: a.remove(i)
Que hay de esto
La salida es
[[1, 2], [5, 6], [7, 8]]
Si su lista es pequeña, entonces también está probando el filtro,
a = [[1,2],[3,4],[5,6],[7,8]] b = 3 print(list(filter(lambda x:x[0]!=b,a)))
salida:
[[1, 2], [5, 6], [7, 8]]