Pergunta

Esta pergunta já tem uma resposta aqui:

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.

Foi útil?

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')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top