Tema 8. Bucles: La Práctica Hace al Maestro. Ejercico 12. purificar


#1

Hola.
Ejercio 12. purificar de 8. Bucles: La Práctica Hace al Maestro:


Escribe una función purificar que tome una lista 
de números, quite todos los 
impares de la lista, y devuelva el resultado.

Por ejemplo, purificar([1,2,3]) debería devolver [2].

Siempre me responde:


¡Uy! Probá otra vez. Tu función falla en purificar([4, 5, 4]). Donde tu 
función devuelve: [4, 5, 4], cuando debería devolver: [4, 4].

He probado dos códigos sencillos que deberían de dar el OK ya que los resultados son correctos.

El primero:

def purificar(l):
    for v in l:
        if v % 2 != 0:
            l.remove(v)
    return l

El segundo:

def purificar(l):
    for i,v in enumerate(l):
        if v % 2 != 0:
            l.pop(i)
    return l

Los dos códigos los he probado por consala en mi PC y los resultados son correctos.
Los resultados también son correctos en la consola web del ejercicio.

def purificar(l):
    for v in l:
        if v % 2 != 0:
            l.remove(v)
    return l
print u"Función 1 (remove): " + \
       "purificar([4,5,4])\n" + \
       "Resultado: %s" % purificar([4,5,4])
print u"Función 1 (remove): " + \
       "purificar([1,2,3,4,5,6,7,8,9,10,11,12])\n" + \
       "Resultado: %s" % purificar([1,2,3,4,5,6,7,8,9,10,11,12])
       
print "---------------------------------------------------------"

def purificar(l):
    for i,v in enumerate(l):
        if v % 2 != 0:
            l.pop(i)
    return l
print u"Función 2 (pop): " + \
       "purificar([4,5,4])\n" + \
       "Resultado: %s" % purificar([4,5,4])
print u"Función 2 (pop): " + \
       "purificar([1,2,3,4,5,6,7,8,9,10,11,12])\n" + \
       "Resultado: %s" % purificar([1,2,3,4,5,6,7,8,9,10,11,12])

Función 1 (remove): purificar([4,5,4])
Resultado: [4, 4]
Función 1 (remove): purificar([1,2,3,4,5,6,7,8,9,10,11,12])
Resultado: [2, 4, 6, 8, 10, 12]
---------------------------------------------------------
Función 2 (pop): purificar([4,5,4])
Resultado: [4, 4]
Función 2 (pop): purificar([1,2,3,4,5,6,7,8,9,10,11,12])
Resultado: [2, 4, 6, 8, 10, 12]
None

¿Existe alguna forma concreta de crear función para que acepte el código? Y sies un bug ¿Existe alguna forma de proceder para recibir el OK y seguir con el siguiente ejercicio sin dejar éste por hacer?

Muchas Gracias
Un saludo a todos


#2

Me respondo yo mismo :slight_smile:

Por lo visto se debe crear una nueva lista y usar append.

def purificar(l):
    r = []
    for v in l:
        if v % 2 == 0:
            r.append(v)
    return r

Esto lo he descubierto viendo el ejercico en inglés. Deberían traducir e incorporar esta parte a Python - Traducción al Español (América Latina)

La prte que no se incluye para Español (America latina):


Do not directly modify the list you are given 
as input; instead, return a new list with only 
the even numbers.

Muchas gracias
Un saludo