Alterando uma list Python dentro de um laço de iteração

Uma tarefa bastante comum para quem mexe com programação é alterar ou deletar dados de uma estrutura de dados dentro de um laço de iteração. Em linguagens que possuem ponteiros isso é mais simples pois podemos manipular precisamente os dados. Porém, em linguagens dinâmicas, como o Python, precisamos ter um pouco de cuidado para obter o que desejamos sem perder a referência dos dados.

Como exemplo vamos supor que temos uma list em Python, com inteiros que vão de 0 a 9 onde queremos deletar os números que forem menores que 5.

Para fazer isso poderíamos pensar no seguinte código:

numeros = range(0,10)

for i in numeros:
   if i < 5: # se o numero for menor que 5
   numeros.remove(i) # delete ele da lista

Contrariando o esperado, o resultado desse script será:

numeros = [1, 3, 5, 6, 7, 8, 9]

Isso acontece pois quando você deleta um elemento dentro do laço, o iterator “i”  perde o endereço daquele valor que saiu da list e acaba “pulando” posições no laço.

Para resolver essa questão podemos utilizar uma list comprehension, o que seria uma solução bastante elegante:

numeros = range(0,10)

numeros[:] = [x for x in numeros if not x < 5]

Você poderia utilizar numeros[] ao invés de numeros[:] porém na primeira opção você está criando uma list totalmente nova no lugar da antiga e não alterando-a e em alguns casos você pode obter alguns bugs.

Na opção numeros[:] você realmente está alterando a list antiga sem perigo de perder referências com o benefício adicional de ser mais rápido, o que pode ser crítico dependendo da quantidade de vezes que você executa esta instrução dentro do seu algoritmo.

Anúncios

Um comentário sobre “Alterando uma list Python dentro de um laço de iteração

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s