Diferencia entre del, remove y pop en listas

>>> a=[1,2,3]
>>> a.remove(2)
>>> a
[1, 3]
>>> a=[1,2,3]
>>> del a[1]
>>> a
[1, 3]
>>> a= [1,2,3]
>>> a.pop(1)
2
>>> a
[1, 3]
>>> 

¿Hay alguna diferencia entre los tres métodos anteriores para eliminar un elemento de una lista?

preguntado el 17 de julio de 12 a las 11:07

Publicación relacionada en líneas similares para establecer la estructura de datos - ¿Diferencia de tiempo de ejecución entre los métodos set.discard y set.remove en Python? -

12 Respuestas

Los efectos de los tres métodos diferentes para eliminar un elemento de una lista:

remove quita el en el primer pareo propuesta de, no es un índice específico:

>>> a = [0, 2, 3, 2]
>>> a.remove(2)
>>> a
[0, 3, 2]

del elimina el elemento en un índice específico:

>>> a = [9, 8, 7, 6]
>>> del a[1]
>>> a
[9, 7, 6]

y pop elimina el elemento en un índice específico y lo devuelve.

>>> a = [4, 3, 5]
>>> a.pop(1)
3
>>> a
[4, 5]

Sus modos de error también son diferentes:

>>> a = [4, 5, 6]
>>> a.remove(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>> del a[7]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> a.pop(7)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range

Respondido el 28 de junio de 20 a las 10:06

pensé del era un remanente de sintaxis de Python 2 como print, pero todavía funciona en python 3. - jxramos

@jxramos: del no es un remanente de sintaxis, no. La sintaxis no ha cambiado, al igual que return or if or while. - Martijn Pieters

Vale la pena mencionar que los usuarios deben tener cuidado al iterar sobre una lista y usar estas funciones al mismo tiempo que iteran. - hamaney

@ rite2hhh prueba la igualdad. Las pruebas de igualdad prueban la identidad primero como una optimización: Martijn Pieters

@ rite2hhh: la igualdad de valores está cubierta en el referencia de expresión. - Martijn Pieters

Utiliza la del para eliminar un elemento por índice, pop() para eliminarlo por índice si necesita el valor devuelto, y remove() para eliminar un elemento por valor. El último requiere buscar en la lista y plantea ValueError si no aparece tal valor en la lista.

Al eliminar el índice i de una lista de n elementos, las complejidades computacionales de estos métodos son

del     O(n - i)
pop     O(n - i)
remove  O(n)

Respondido el 15 de Septiembre de 20 a las 08:09

¿El pop requiere buscar en la lista? sachin irukula

+1 para el desglose de la complejidad. Ilustra cómo delete y pop son constantes cuando el elemento está al final de la lista. - Sharpie grande

Recuerden muchachos... todo lo que se base en índices es un solo disparo O(n-1)... si tienen que hacer una búsqueda (por valor), atravesará la colección hasta que se encuentre el elemento. - Pepito Fernández

@PepitoFernandez Las búsquedas por índice en una lista son O(1) en Python. (Una lista en Python es similar a un vector en C++.) - Sven Marnach

@PlasmaBinturong Debería usar lo que crea que es más legible, a menos que tenga datos que demuestren que el rendimiento es importante. Y si es así, necesita medir qué es más rápido en su caso específico. Mi conjetura es también que del es un poco más rápido, pero por una razón diferente: la búsqueda de __delitem__ en un tipo implementado en C ocurre por índice en lugar de por nombre, mientras que pop debe buscarse siguiendo todo el protocolo del descriptor. La ejecución de las funciones en sí debería tomar la misma cantidad de tiempo. Ambos devuelven un puntero: uno al objeto eliminado, el otro a None. - Sven Marnach

Como nadie más lo ha mencionado, tenga en cuenta que del (diferente a pop) permite la eliminación de un rango de índices debido al corte de listas:

>>> lst = [3, 2, 2, 1]
>>> del lst[1:]
>>> lst
[3]

Esto también permite evitar una IndexError si el índice no está en la lista:

>>> lst = [3, 2, 2, 1]
>>> del lst[10:]
>>> lst
[3, 2, 2, 1]

Respondido 27 Feb 17, 08:02

Ya respondido bastante bien por otros. Este de mi parte :)

quitar vs pop vs del

Evidentemente, pop es el único que devuelve el valor, y remove es el único que busca el objeto, mientras que del se limita a una simple supresión.

Respondido el 20 de junio de 20 a las 10:06

¡Gracias! Una nota: en python, debido a la forma en que se implementan las listas (¡prácticamente hay arreglos...!), "Avanzar hasta esa posición de nodo" es O(1) - NTG

Hay muchas buenas explicaciones aquí, pero haré todo lo posible para simplificar más.

Entre todos estos métodos, remove & pop se encuentran las sufijo mientras que eliminar es prefijo.

remove(): Se utiliza para eliminar la primera aparición de un elemento.
remove(n) => primera aparición de n en la lista.

>>> a = [0, 2, 3, 2, 1, 4, 6, 5, 7]
>>> a.remove(2)   # where i = 2
>>> a
[0, 3, 2, 1, 4, 6, 5, 7]

pop(): Se utiliza para eliminar elementos...

  • si no se especifica ningún índice:
    pop() => desde el final de la lista
>>> a.pop()
>>> a
[0, 3, 2, 1, 4, 6, 5]
  • si se especifica un índice:
    pop(index) => de índice
>>> a.pop(2)
>>> a
[0, 3, 1, 4, 6, 5]

ADVERTENCIA: Método peligroso por delante

del(): Es un método de prefijo.

Esté atento a dos sintaxis diferentes para el mismo método: with [] y sin. Posee poder para:

  • Eliminar índice
    del a[index] => utilizado para eliminar por índice y su valor asociado al igual que pop.
>>> del a[1]
>>> a
[0, 1, 4, 6, 5]
  • Eliminar valores en el rango [index_1:index_N]:
    del a[0:3] => múltiples valores en el rango.
>>> del a[0:3]
>>> a
[6, 5]
  • Por último, pero no menos importante, para eliminar toda la lista de una sola vez.
    del (a) => como se dijo anteriormente.
>>> del (a)
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

Espero que esto aclare la confusión.

Respondido el 11 de diciembre de 21 a las 11:12

cual es la diferencia entre postfix y prefix? - la hora de la comida

Función de eliminación de Postfix: encuentra el valor y lo elimina. Función de eliminación de prefijo: elimina según el prefijo - NStavrakoudis

Deliciosos

Toma el índice (cuando se proporciona, de lo contrario toma el último), elimina el valor en ese índice y devuelve el valor

remove

Toma valor, elimina la primera aparición y no devuelve nada

borrar

Toma el índice, elimina el valor en ese índice y no devuelve nada

respondido 09 nov., 20:22

pop también elimine el valor de la lista - Talha Junaid

Cualquier operación/función en diferentes estructuras de datos se define para acciones particulares. Aquí, en su caso, es decir, eliminar un elemento, eliminar, abrir y eliminar. (Si considera conjuntos, agregue otra operación - descarte) Otro caso confuso es al agregar. Insertar/Anexar. Para demostración, implementemos deque. deque es una estructura de datos lineal híbrida, donde puede agregar elementos / eliminar elementos de ambos extremos (extremos posterior y frontal)

class Deque(object):

  def __init__(self):

    self.items=[]

  def addFront(self,item):

    return self.items.insert(0,item)
  def addRear(self,item):

    return self.items.append(item)
  def deleteFront(self):

    return self.items.pop(0)
  def deleteRear(self):
    return self.items.pop()
  def returnAll(self):

    return self.items[:]

Aquí, vea las operaciones:

def deleteFront(self):

    return self.items.pop(0)
def deleteRear(self):
    return self.items.pop()

Las operaciones tienen que devolver algo. Entonces, pop: con y sin índice. Si no quiero devolver el valor: del self.items[0]

Eliminar por valor, no por índice:

  • retirar :

    list_ez=[1,2,3,4,5,6,7,8]
    for i in list_ez:
        if i%2==0:
            list_ez.remove(i)
    print list_ez
    

Devuelve [1,3,5,7]

Consideremos el caso de los conjuntos.

set_ez=set_ez=set(range(10))

set_ez.remove(11)

# Gives Key Value Error. 
##KeyError: 11

set_ez.discard(11)

# Does Not return any errors.

Respondido 10 Jul 17, 18:07

Aquí hay una respuesta detallada.

del se puede usar para cualquier objeto de clase, mientras que pop y remove y limitado a clases específicas.

Para del

Aquí hay unos ejemplos

>>> a = 5
>>> b = "this is string"
>>> c = 1.432
>>> d = myClass()

>>> del c
>>> del a, b, d   # we can use comma separated objects

Podemos anular __del__ método en las clases creadas por el usuario.

Usos específicos con lista

>>> a = [1, 4, 2, 4, 12, 3, 0]
>>> del a[4]
>>> a
[1, 4, 2, 4, 3, 0]

>>> del a[1: 3]   # we can also use slicing for deleting range of indices
>>> a
[1, 4, 3, 0]

Para pop

pop toma el índice como parámetro y elimina el elemento en ese índice

Diferente a la del, pop cuando se llama al objeto de la lista, devuelve el valor en ese índice

>>> a = [1, 5, 3, 4, 7, 8]
>>> a.pop(3)  # Will return the value at index 3
4
>>> a
[1, 5, 3, 7, 8]

Para remove

remove toma el valor del parámetro y elimina ese valor de la lista.

Si hay varios valores presentes, se eliminará la primera aparición.

Note: arrojará ValueError si ese valor no está presente

>>> a = [1, 5, 3, 4, 2, 7, 5]
>>> a.remove(5)  # removes first occurence of 5
>>> a
[1, 3, 4, 2, 7, 5]
>>> a.remove(5)
>>> a
[1, 3, 4, 2, 7]

Espero que esta respuesta sea útil.

Respondido 09 Oct 20, 14:10

Mientras pop y delete, ambos toman índices para eliminar un elemento como se indica en los comentarios anteriores. Una diferencia clave es la complejidad del tiempo para ellos. La complejidad de tiempo para pop() sin índice es O(1) pero no es el mismo caso para la eliminación del último elemento.

Si su caso de uso es siempre eliminar el último elemento, siempre es preferible usar pop() en lugar de delete(). Para obtener más explicaciones sobre las complejidades del tiempo, puede consultar https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

Respondido el 04 de Septiembre de 16 a las 21:09

Esto está mal de múltiples maneras. No existe tal método como delete. Las diferencias son que pop devuelve el valor, y eso del funciona en rebanadas. En los casos en que pop trabajos, del tiene exactamente la misma complejidad computacional (y es un poco más rápido por un término constante). - abarnert

El remove operación en una lista recibe un valor para eliminar. Busca en la lista para encontrar un elemento con ese valor y elimina el primer elemento coincidente que encuentra. Es un error si no hay un elemento coincidente, genera un ValorError.

>>> x = [1, 0, 0, 0, 3, 4, 5]
>>> x.remove(4)
>>> x
[1, 0, 0, 0, 3, 5]
>>> del x[7]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[7]
IndexError: list assignment index out of range

El del La declaración se puede utilizar para eliminar una lista completa. Si tiene un elemento de lista específico como su argumento para eliminar (por ejemplo, nombre de lista [7] para hacer referencia específica al octavo elemento de la lista), simplemente eliminará ese elemento. Incluso es posible eliminar un "segmento" de una lista. Es un error si hay índice fuera de rango, levanta un IndexError.

>>> x = [1, 2, 3, 4]
>>> del x[3]
>>> x
[1, 2, 3]
>>> del x[4]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    del x[4]
IndexError: list assignment index out of range

El uso habitual de Deliciosos es eliminar el último elemento de una lista mientras usa la lista como una pila. A diferencia de del, pop devuelve el valor que sacó de la lista. Opcionalmente, puede dar un valor de índice para que aparezca y aparezca desde el final de la lista (por ejemplo, listname.pop(0) eliminará el primer elemento de la lista y devolverá ese primer elemento como resultado). Puede usar esto para hacer que la lista se comporte como una cola, pero hay rutinas de biblioteca disponibles que pueden proporcionar operaciones de cola con mejor rendimiento que pop(0). Es un error si hay índice fuera de rango, levanta un IndexError.

>>> x = [1, 2, 3] 
>>> x.pop(2) 
3 
>>> x 
[1, 2]
>>> x.pop(4)
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    x.pop(4)
IndexError: pop index out of range

Ver colecciones.deque para más información.

Respondido 09 ago 18, 18:08

Eliminar básicamente funciona en el valor. Eliminar y hacer estallar el trabajo en el índice

Eliminar básicamente elimina el primer valor coincidente. Delete elimina el elemento de un índice específico. Pop básicamente toma un índice y devuelve el valor en ese índice. La próxima vez que imprima la lista, el valor no aparecerá.

Ejemplo:

respondido 28 nov., 19:11

Aunque le agradecemos su respuesta, sería mejor si proporcionara un valor adicional además de las otras respuestas. En este caso, tu respuesta no aporta valor adicional, ya que otros usuarios cubrieron todo lo que has incluido en tu respuesta. Como problema secundario, no incluya texto como imágenes cuando podría pegarlo como texto. Si una respuesta anterior fue útil para usted, debe votarlo. - David Buck

También puede usar eliminar para eliminar un valor por índice.

n = [1, 3, 5]

n.remove(n[1])

n entonces se referiría a [1, 5]

Respondido 29 Oct 15, 13:10

Trata n = [5, 3, 5], entonces n.remove(n[2]). - abarnert

@abarnert su caso de uso funciona en sincronía con el siguiente caso n = [5,3,5] , luego n.remove(5). Ambos eliminan el primer elemento encontrado de la lista. - Akhil Ghatiki

@AkhilGhatiki n.remove(n[2]) elimina n[0]no, n[2]. Por lo tanto, no es solo tiempo lineal sin motivo (tal vez no sea un gran problema cuando N = 3), también está mal (un gran problema sin importar qué N sea) - abarnert

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.