Diferença entre del, remove e pop nas listas


Respostas:


1333

Sim, removeremove o primeiro valor correspondente , não um índice específico:

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

del remove o item em um índice específico:

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

e popremove o item em um índice específico e o retorna.

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

Seus modos de erro também são 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

14
@ jxramos: delnão é uma manutenção de sintaxe, não. A sintaxe é inalterada, assim como returnou ifou while.
Martijn Pieters

6
Vale ressaltar que os usuários devem ter cuidado ao iterar sobre uma lista e usar essas funções nela ao mesmo tempo em que estão iterando.
hamaney

16
O delexemplo é um pouco enganador. Qual elemento é removido, exatamente? O 2º ou o 3º? Você deveria ter usado [9, 8, 7, 6], del a[1]e[9, 7, 6]
gromit190 19/04/19

2
@ rite2hhh testa a igualdade. Testes de igualdade testam primeiro a identidade como uma otimização
Martijn Pieters

1
@ rite2hhh: igualdade de valor é abordada na referência de expressão .
Martijn Pieters

184

Use delpara remover um elemento por índice, pop()para removê-lo por índice, se você precisar do valor retornado, e remove()para excluir um elemento por valor. O último requer pesquisa na lista e aumenta ValueErrorse esse valor não ocorrer na lista.

Ao excluir o índice ide uma lista de nelementos, as complexidades computacionais desses métodos são

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

1
O pop requer pesquisa na lista
Sachin irukula

31
+1 para detalhamento da complexidade. Ilustra como excluir e pop são constantes quando o elemento está no final da lista.
Big Sharpie

2
Lembre-se, pessoal ... qualquer coisa com base no índice é um tiro O (n-1) ... se você precisar fazer uma pesquisa (por valor), ele percorrerá a coleção até que o elemento seja encontrado.
Pepito Fernandez 14/10

2
@PepitoFernandez As pesquisas por índice em uma lista são O (1) em Python. (A lista em Python é semelhante a um vector em C ++.)
Sven Marnach

3
@PlasmaBinturong Você deve usar o que acha mais legível, a menos que tenha dados que comprovem que o desempenho é importante. E se você tiver, precisará medir o que é mais rápido no seu caso específico. Meu palpite também é que delé um pouco mais rápido, mas por um motivo diferente: a pesquisa __delitem__em um tipo implementado em C acontece por índice e não por nome, enquanto que popprecisa ser pesquisada seguindo todo o protocolo do descritor. A execução das próprias funções deve levar a mesma quantidade de tempo. Ambos retornam um ponteiro - um para o objeto removido e o outro para None.
Sven Marnach 29/11/19

92

Como ninguém mais o mencionou, observe que del(ao contrário pop) permite a remoção de um intervalo de índices devido ao fatiamento da lista:

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

Isso também permite evitar um IndexErrorse o índice não estiver na lista:

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

55

Já respondeu muito bem por outros. Este do meu fim :)

remover vs pop vs del

Evidentemente, popé o único que retorna o valor e removeé o único que pesquisa o objeto, enquanto se dellimita a uma simples exclusão.


2
Thnx! Uma observação: em python, devido à maneira como as listas são implementadas (há praticamente matrizes ...!), "Avançar até a posição do nó" é O (1)
ntg 28/11/18

19

pop - Pega índice e retorna valor

remove - Pega valor, remove a primeira ocorrência e não retorna nada

delete - pega o índice, remove o valor nesse índice e não retorna nada


19

Muitas das melhores explicações estão aqui, mas tentarei o meu melhor para simplificar mais.

Entre todos esses métodos, reverse e pop são postfix, enquanto delete é prefixo .

remove (): usado para remover a primeira ocorrência do elemento

remove(i) => primeira ocorrência do valor i

>>> 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 (): usado para remover o elemento se:

não especificado

pop() => do fim da lista

>>>a.pop()
>>>a
[0, 3, 2, 1, 4, 6, 5]

Especificadas

pop(index) => do índice

>>>a.pop(2)
>>>a
[0, 3, 1, 4, 6, 5]

AVISO: Método perigoso adiante

delete () : é um método de prefixo.

Fique de olho em duas sintaxes diferentes para o mesmo método: [] e (). Possui poder para:

1. índice de exclusão

del a[index] => usado para excluir o índice e seu valor associado, assim como pop.

>>>del a[1]
>>>a
[0, 1, 4, 6, 5]

2.Excluir valores no intervalo [índice 1: índice N]

del a[0:3] => vários valores no intervalo

>>>del a[0:3]
>>>a
[6, 5]

3.Última, mas não a lista, para excluir a lista inteira de uma só vez

del (a) => como dito acima.

>>>del (a)
>>>a

Espero que isso esclareça a confusão, se houver.


2

Qualquer operação / função em diferentes estruturas de dados é definida para ações específicas. Aqui no seu caso, ou seja, removendo um elemento, exclua, pop e remova. (Se você considerar conjuntos, adicione outra operação - descartar). Outro caso confuso é ao adicionar. Inserir / Anexar. Para demonstração, vamos implementar deque. deque é uma estrutura de dados linear híbrida, na qual é possível adicionar elementos / remover elementos de ambas as extremidades.

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

Aqui, veja as operações:

def deleteFront(self):

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

As operações precisam retornar algo. Então, pop - com e sem um índice. Se não quiser retornar o valor: del self.items [0]

Excluir por valor, não í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

Retornos [1,3,5,7]

vamos considerar o caso dos 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.

1

Enquanto pop e delete ambos assumem índices para remover um elemento como indicado nos comentários acima. Uma diferença fundamental é a complexidade do tempo para eles. A complexidade de tempo para pop () sem índice é O (1), mas não é o mesmo caso para exclusão do último elemento.

Se o seu caso de uso é sempre para excluir o último elemento, é sempre preferível usar pop () em vez de delete (). Para obter mais explicações sobre a complexidade do tempo, consulte https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt


2
Isso está errado de várias maneiras. Não existe um método como delete. As diferenças são que popretorna o valor e delfunciona em fatias. Nos casos em que popfunciona, delpossui exatamente a mesma complexidade computacional (e é um pouco mais rápida por um termo constante).
abarnert

1

A operação de remoção em uma lista recebe um valor para remover. Ele pesquisa na lista para encontrar um item com esse valor e exclui o primeiro item correspondente encontrado. É um erro se não houver item correspondente, gera um ValueError .

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

A instrução del pode ser usada para excluir uma lista inteira. Se você tem um item de lista específico como argumento a ser deletado (por exemplo, nome da lista [7] para referenciar especificamente o 8º item da lista), ele simplesmente exclui esse item. É até possível excluir uma "fatia" de uma lista. É um erro se o índice fora do intervalo gerar um 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

O uso usual do pop é excluir o último item de uma lista à medida que você usa a lista como uma pilha. Ao contrário de del, pop retorna o valor que saiu da lista. Opcionalmente, você pode atribuir um valor de índice para pop e pop a partir do final da lista (por exemplo, listname.pop (0) excluirá o primeiro item da lista e retornará esse primeiro item como resultado). Você pode usar isso para fazer a lista se comportar como uma fila, mas existem rotinas de biblioteca disponíveis que podem fornecer operações de fila com melhor desempenho do que o pop (0). É um erro se o índice fora do intervalo gerar um 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

Veja collections.deque para mais detalhes.


-1

Remover basicamente funciona no valor. Excluir e exibir trabalho no índice

Remover basicamente remove o primeiro valor correspondente. Excluir exclui o item de um índice específico. O Pop basicamente pega um índice e retorna o valor nesse índice. Na próxima vez que você imprimir a lista, o valor não aparecerá.

Exemplo:


3
Apesar de agradecermos sua resposta, seria melhor se ela fornecesse valor adicional além das outras respostas. Nesse caso, sua resposta não fornece valor adicional, pois outros usuários cobriram tudo o que você incluiu em sua resposta. Como um problema secundário, não inclua texto como imagens quando puder colá-lo como texto. Se uma resposta anterior foi útil para você, você deve votar .
David Buck

-3

Você também pode usar remove para remover um valor pelo índice também.

n = [1, 3, 5]

n.remove(n[1])

n se referiria a [1, 5]


43
Tente n = [5, 3, 5]então n.remove(n[2]).
abarnert

@abarnert, seu caso de uso funciona em sincronia com o caso abaixo n = [5,3,5], depois n.remove (5). Ambos removem o primeiro elemento encontrado da lista.
Akhil Ghatiki 31/03

@AkhilGhatiki n.remove(n[2])remove n[0], não n[2]. Portanto, não é apenas tempo linear sem motivo (talvez não um grande negócio quando N = 3), também é errado (um grande negócio não importa o que N é)
abarnert
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.