Remova os elementos ao atravessar uma lista em Python [duplicado
-
20-09-2019 - |
Pergunta
Esta pergunta já tem uma resposta aqui:
- Como remover itens de uma lista enquanto itera? 26 respostas
Em java, posso fazer usando um Iterator
e depois usando o .remove()
Método do iterador para remover o último elemento retornado pelo iterador, como este:
import java.util.*;
public class ConcurrentMod {
public static void main(String[] args) {
List<String> colors = new ArrayList<String>(Arrays.asList("red", "green", "blue", "purple"));
for (Iterator<String> it = colors.iterator(); it.hasNext(); ) {
String color = it.next();
System.out.println(color);
if (color.equals("green"))
it.remove();
}
System.out.println("At the end, colors = " + colors);
}
}
/* Outputs:
red
green
blue
purple
At the end, colors = [red, blue, purple]
*/
Como eu faria isso em Python? Não posso modificar a lista enquanto itera em um loop for para o loop, porque ela faz com que as coisas sejam ignoradas (veja aqui). E não parece haver um equivalente ao Iterator
Interface de Java.
Solução
Itera sobre um cópia de da lista:
for c in colors[:]:
if c == 'green':
colors.remove(c)
Outras dicas
A melhor abordagem em Python é fazer uma nova lista, idealmente em uma listcomp, definindo -a como o [:]
do antigo, por exemplo:
colors[:] = [c for c in colors if c != 'green']
NÃO colors =
Como algumas respostas podem sugerir - que apenas reembolsa o nome e acabará deixando algumas referências ao antigo "corpo" pendurado; colors[:] =
é muito melhor em todas as contagens ;-).
Você pode usar a função do filtro:
>>> colors=['red', 'green', 'blue', 'purple']
>>> filter(lambda color: color != 'green', colors)
['red', 'blue', 'purple']
>>>
ou você também pode fazer assim
>>> colors = ['red', 'green', 'blue', 'purple']
>>> if colors.__contains__('green'):
... colors.remove('green')