Como otros mencionados, pop y del son las formas eficientes de eliminar un elemento de índice dado. Sin embargo, solo por completar (ya que lo mismo se puede hacer de muchas maneras en Python):
Uso de sectores (esto no elimina en su lugar el elemento de la lista original):
(Además, este será el método menos eficiente cuando se trabaja con la lista de Python, pero esto podría ser útil (pero no eficiente, reitero) cuando se trabaja con objetos definidos por el usuario que no admiten pop, pero definen a __getitem__
):
>>> a = [1, 2, 3, 4, 5, 6]
>>> index = 3 # Only positive index
>>> a = a[:index] + a[index+1 :]
# a is now [1, 2, 3, 5, 6]
Nota: Tenga en cuenta que este método no modifica la lista en su lugar como pop
y del
. En su lugar, hace dos copias de las listas (una desde el principio hasta el índice pero sin ella ( a[:index]
) y otra después del índice hasta el último elemento ( a[index+1:]
)) y crea un nuevo objeto de lista agregando ambos. Esto luego se reasigna a la variable de lista ( a
). Por lo tanto, el objeto de lista anterior se desreferencia y, por lo tanto, se recolecta basura (siempre que el objeto de lista original no sea referenciado por ninguna variable que no sea a).
Esto hace que este método sea muy ineficiente y también puede producir efectos secundarios indeseables (especialmente cuando otras variables apuntan al objeto de lista original que permanece sin modificar).
Gracias a @MarkDickinson por señalar esto ...
Esta respuesta de desbordamiento de pila explica el concepto de corte.
También tenga en cuenta que esto solo funciona con índices positivos.
Mientras se usa con objetos, el __getitem__
método debe haberse definido y, lo que es más importante __add__
, debe haberse definido para devolver un objeto que contenga elementos de ambos operandos.
En esencia, esto funciona con cualquier objeto cuya definición de clase sea como:
class foo(object):
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return foo(self.items[index])
def __add__(self, right):
return foo( self.items + right.items )
Esto funciona con lo list
que define __getitem__
y __add__
métodos.
Comparación de las tres formas en términos de eficiencia:
Suponga que lo siguiente está predefinido:
a = range(10)
index = 3
El del object[index]
método:
Con mucho, el método más eficiente. Funciona con todos los objetos que definen un __del__
método.
El desmontaje es el siguiente:
Código:
def del_method():
global a
global index
del a[index]
Desmontaje
10 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 DELETE_SUBSCR # This is the line that deletes the item
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
None
pop
método:
Es menos eficiente que el método del y se usa cuando necesita obtener el elemento eliminado.
Código:
def pop_method():
global a
global index
a.pop(index)
Desmontaje
17 0 LOAD_GLOBAL 0 (a)
3 LOAD_ATTR 1 (pop)
6 LOAD_GLOBAL 2 (index)
9 CALL_FUNCTION 1
12 POP_TOP
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
El método de cortar y agregar.
El menos eficiente.
Código:
def slice_method():
global a
global index
a = a[:index] + a[index+1:]
Desmontaje
24 0 LOAD_GLOBAL 0 (a)
3 LOAD_GLOBAL 1 (index)
6 SLICE+2
7 LOAD_GLOBAL 0 (a)
10 LOAD_GLOBAL 1 (index)
13 LOAD_CONST 1 (1)
16 BINARY_ADD
17 SLICE+1
18 BINARY_ADD
19 STORE_GLOBAL 0 (a)
22 LOAD_CONST 0 (None)
25 RETURN_VALUE
None
Nota: En los tres desmontazos, ignore las dos últimas líneas que básicamente son return None
. También las dos primeras líneas están cargando los valores globales a
y index
.
O(n)
en operación a tiempo.deque()
proporciona operaciones eficientes en ambos extremos, pero no proporciona O (1) inserciones / búsquedas / eliminaciones en el medio.