HOWTO · Python
Remova todas as ocorrências de um elemento de uma lista em Python
Neste artigo, veremos como podemos remover todas as ocorrências de um elemento de uma Lista em Python.
Nesta página
Uma lista em Python pode armazenar o mesmo valor muitas vezes, e cada ocorrência é um item distinto em sua própria posição na lista. O remove() exclui apenas a primeira correspondência, portanto remover todas as ocorrências de um valor exige uma abordagem diferente. A opção mais direta é uma compreensão de lista, que cria uma nova lista mantendo apenas os itens desejados; o filter() oferece uma alternativa baseada em predicado, e um loop em torno do remove() funciona quando a lista original precisa ser modificada no local.
Remova todos os itens correspondentes com uma compreensão de lista
Uma compreensão de lista mantém cada item que satisfaz uma condição e reúne os sobreviventes em uma nova lista. Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
numbers = [1, 2, 3, 4, 2, 5, 2]
target = 2
filtered = [x for x in numbers if x != target]
print(filtered)
print(numbers)
[1, 3, 4, 5]
[1, 2, 3, 4, 2, 5, 2]
A condição x != target mantém todo valor que não é 2, então as três cópias desaparecem de filtered enquanto numbers ainda contém os dados originais. Para substituir a variável original em vez de manter duas listas, atribua o resultado de volta a ela: numbers = [x for x in numbers if x != target]. Outros nomes vinculados ao objeto de lista antigo ainda veem os itens não filtrados, o que geralmente é o desejado quando o chamador é o dono da lista.
Se o valor nunca aparecer na lista, a compreensão ainda assim é executada e produz uma lista com todos os itens originais:
numbers = [1, 3, 4, 5]
target = 2
filtered = [x for x in numbers if x != target]
print(filtered)
[1, 3, 4, 5]
Isso torna a compreensão segura para executar sem verificar antes se o valor está presente.
Remova todos os itens correspondentes com filter()
A função filter() aplica um predicado a cada item e produz apenas os itens para os quais o predicado é verdadeiro. No Python 3, ela retorna um iterador, não uma lista, então passe o resultado para list() quando precisar de uma lista reutilizável. O predicado costuma ser um lambda, uma pequena função anônima, que compara cada item com o alvo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
numbers = [1, 2, 3, 4, 2, 5, 2]
target = 2
filtered = list(filter(lambda x: x != target, numbers))
print(filtered)
[1, 3, 4, 5]
Assim como a compreensão, o filter() cria uma nova sequência e deixa numbers intacto; um alvo que nunca ocorre produz uma lista igual à entrada. Use o filter() quando um predicado já existir ou precisar ser reutilizado, e prefira a compreensão quando a condição for uma verificação pontual como x != target.
Remova todos os itens correspondentes com remove()
O remove() é um método de lista que exclui apenas o primeiro item igual ao seu argumento e altera a lista no local. Uma única chamada nunca consegue limpar duplicatas, então repita-a enquanto o valor ainda estiver presente:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
numbers = [1, 2, 3, 4, 2, 5, 2, 6]
target = 2
while target in numbers:
numbers.remove(target)
print(numbers)
[1, 3, 4, 5, 6]
Cada iteração percorre a lista uma vez para target in numbers e novamente dentro do remove() para localizar a primeira correspondência, portanto o loop realiza duas buscas por item removido. A condição do while também é a salvaguarda: quando não resta nenhuma correspondência, o teste é falso e o loop para. Chamar remove() com um valor que não está na lista gera ValueError, então a verificação de pertinência — ou uma guarda equivalente com numbers.count(target) — é o que torna a remoção repetida segura. Quando o alvo nunca esteve na lista, o corpo do loop nunca é executado e a lista mantém todos os seus itens.
Escolha a abordagem certa
- Precisa de uma cópia filtrada: use uma compreensão de lista. Ela faz uma única passagem pela lista, declara a condição inline e deixa a original intacta.
- Precisa reutilizar um predicado: use
filter()comlambdaou uma função nomeada. O resultado é um iterador preguiçoso, então lembre-se da chamada alist()quando precisar de uma lista concreta. - Precisa de mutação no local: use o loop
while ... remove()quando outro código precisar observar a alteração no mesmo objeto de lista. Como cada item removido custa uma varredura de pertinência mais uma varredura de remoção, ele faz mais trabalho do que a compreensão de passagem única em listas longas com muitas correspondências.
Para tamanhos típicos de lista, a compreensão é a solução mais clara e rápida de escrever; as varreduras extras do loop só se tornam perceptíveis quando as listas crescem ou as remoções são executadas com frequência.