Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

por que o for não consegue ler itens de uma lista onde a str tem menos que 4 caracteres?

criei um código para manter apenas as palavras com 4 caracteres na lista: def nao_e_quatro(lista): for not_quatro in lista: if len(not_quatro) != 4: lista.remove(not_quatro) return lista

print(nao_e_quatro(['Ryan', 'Cool Man', 'a', 'farofa', '12', 'fregref']))

Porém, o for sempre ignora o '12' e o 'a'

3 respostas
solução!

Olá Daniel,

O problema é que você está modificando a lista enquanto executa o for, então você está afetando o funcionamento do for.

Isso acontece porque o for funciona baseado no tamalho da sua lista, então quando você remove um elemento o tamanho da lista muda e o for pula um elemento.

Tudo que você tem que fazer é criar uma cópia da lista antes do for, e utilizar essa lista na linha inicial do for:

def nao_e_quatro(lista):
  lista_temp = lista.copy()

  for not_quatro in lista_temp:
    if len(not_quatro) != 4:
      lista.remove(not_quatro)

  return lista

print(nao_e_quatro(['Ryan', 'Cool Man', 'a', 'farofa', '12', 'fregref']))

Espero ter ajudado, qualquer dúvida é só falar!

Daniel, tudo bem? Tem um pequeno erro de lógica no seu algoritmo. Sempre que ele encontra um valor a ser removido ele remove, traz os elementos para frente (uma posição) e volta a avaliar os valores pulando a posição que ele removeu. Isso sempre vai acontecer com valores que não forem 4 e que tiveram o valor da frente removidos. Tentando explicar graficamente embaixo, o * mostra onde ele está avaliando o valor no array:

*1 1 4 2 5 4 3 --> verificação 1
1 *4 2 5 4 3 --> verificação 2
1 4 5 *4 3 --> verificação 3
1 4 5 4 *3 --> verificação 4
1 4 5 4 --> verificação 5

A melhor abordagem é mesmo verificar na lista original e fazer um .append() com os itens que forem de tamanho 4.

Thanks! :D Minha logica estava realmente quebrada, vou concertar aqui :)