Eliminar un elemento de una lista de listas en función de cada uno de los primeros elementos de las listas

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