Python - Problema recorriendo una lista con "for" y .remove()

 
Vista:
Imágen de perfil de J
Val: 22
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por J (4 intervenciones) el 31/07/2020 23:03:18
Hola soy un poco novato aun y ando haciendo ejercicios para mejorar. Me encuentro haciendo un ejercicio y en uno de sus puntos me encuentro con el siguiente problema:

1
lista = [14, 64, 23, 5, 29, 92, 12, 239, 4, 11, 32]

# De la lista debo eliminar los impares y lo he intentado hacer de la siguiente forma

1
2
3
4
for borrar in lista:
    if borrar % 2 == 1:
        lista.remove(borrar)
print(lista) # [14, 64, 5, 92, 12, 4, 32]
El problema radica en que al eliminar el indice en el que el for esta trabajando en la siguiente iteración pasa al siguiente indice. Es decir si borrar 23 [2] pasa al siguiente elemento [3]. Pero tras borrar el indice [2] el valor del 5 pasa a ocupar su posición y se lo salta.
Me gustaría saber si se podría solucionar este problema de alguna forma, para que el for no se salte el elemento.
O la única solución radicaría en crear una lista nueva con los pares y reemplazar la lista de los pares por la original.
¡Gracias y un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
2
Responder
sin imagen de perfil
Val: 233
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con 'for' y .remove()

Publicado por salvamn (62 intervenciones) el 01/08/2020 03:41:38
hola amigo, mira lo que pude entender de que es lo que quieres es que al borrar un numero el espacio se conserve y el siguiente numero no reemplaze el numero eliminado, si es eso lo que quieres te dejo este codigo.

la variable 'a' lo que hace es tomar la variable 'borrar' y preguntarle el indice en que el 'for' se detuvo y paso al 'if'
al final lo que hago es modificar el numero impar por unas comillas vacias, no lo elimino.

este seria el resultado [14, 64, ' ', ' ', ' ', 92, 12, ' ', 4, ' ', 32]

1
2
3
4
5
6
7
8
lista = [14, 64, 23, 5, 29, 92, 12, 239, 4, 11, 32]
 
for borrar in lista:
    if borrar % 2 == 1:
        a = lista.index(borrar)
        lista[a] = " "
        print(a)
print(lista)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
Imágen de perfil de Jaime
Val: 526
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por Jaime (136 intervenciones) el 01/08/2020 13:55:00
Mi aporte para este error lógico, que al principio me parecia sencillo, pero al momento de buscar una solución se complicó.
Mi solución es recorrer la lista de atras hacia a adelante.
1
2
3
4
5
6
7
lista = [14,64,23,5,29,92,12,239,4,11,32]
 
    for i in range((len(lista)-1),0,-1):
        if lista[i] % 2 == 1:
                lista.pop(i)
 
    print (lista)

Espero te sirva.

Te agradecería un voto por la respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de J
Val: 22
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por J (4 intervenciones) el 01/08/2020 17:43:27
¡Gracias por la solución!
Esta mañana pensé lo mismo recorrerla inversamente para evitar que afecte el eliminar indice. ^^
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema recorriendo una lista con "for" y .remove()

Publicado por yoyyo (1 intervención) el 02/08/2020 00:20:40
hola:
lo que han hecho de recorrer la lista de forma inversa es una solución, pero no la única:
1
2
3
4
5
6
7
lista = [14, 64, 23, 5, 29, 92, 12, 239, 4, 11, 32]
 
for elemento in list(lista) : # recorro una copia de la lista
    if elemento % 2 !=0:
        lista.remove(elemento)
 
print(lista)

y esta línea tiene un error:

1
for i in range((len(lista)-1),0,-1):

facil de comprobar si el primer elemento es impar

debería ser:

1
for i in range((len(lista)-1),-1,-1):

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de katas
Val: 1.703
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por katas (77 intervenciones) el 02/08/2020 11:48:29
La manera correcta es utilizar filter...

1
2
3
4
5
lista = [14, 64, 23, 5, 29, 92, 12, 239, 4, 11, 32]
 
lista=list(filter(lambda el: el%2==0, lista))
 
print(lista) # [14, 64, 92, 12, 4, 32]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Problema recorriendo una lista con "for" y .remove()

Publicado por yoyyo (1 intervención) el 02/08/2020 12:34:53
vaya con la respuesta:"la manera correcta"
veamos:
1) no sabía que había una manera correcta, pero ya que estamos...
2)pide for y remove, quizá es parte de un ejercicio que lo exige
3) en todo caso comprensión de listas es mejor que lambda y filter juntas, por claridad y velocidad
1
lista = [par for par in lista if par %2 == 0]
pero como dije, ahí no estaría el remove
4)un poco menos de ego diría que: "otra manera es con lambda y filter"
jajaja "manera correcta"...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de katas
Val: 1.703
Plata
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por katas (77 intervenciones) el 02/08/2020 12:41:47
Toda la razón yoyyo... siento haber dicho que esa era la manera correcta!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de J
Val: 22
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por J (4 intervenciones) el 02/08/2020 19:59:06
Gracias por el aporte.

No es que el ejercicio los requiera for y remove(), pero si es verdad que se sobrentiende que la solución no es algo mucho más complicada. En ese punto por poner el caso ni se han visto ni creación de funciones y clases.

La pregunta la plantee porque me pareció algo curioso del funcionamiento de un for junto a remove().
Obviamente, hay varias soluciones, pero me llamo la atención un problema derivado del cambio del indice durante el bucle. Y me pareció interesante plantearlo y ver que soluciones se podían plantear al problema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de J
Val: 22
Ha disminuido su posición en 2 puestos en Python (en relación al último mes)
Gráfica de Python

Problema recorriendo una lista con "for" y .remove()

Publicado por J (4 intervenciones) el 02/08/2020 20:29:37
26128ce5-56dd-4fee-98db-d4e2f38619a7

Aquí otra solución, que me planteo un familiar, usando recursividad. Aunque toca traducirla a Python.

¡Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar