Así que estoy obteniendo un comportamiento interesante de algunos filtros apilados dentro de un ciclo for. Voy a empezar con una demostración:Comportamiento extraño de las llamadas al filtro apilado()
>>> x = range(100)
>>> x = filter(lambda n: n % 2 == 0, x)
>>> x = filter(lambda n: n % 3 == 0, x)
>>> list(x)
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]
Aquí obtenemos el resultado esperado. Tenemos un rango dentro de un filtro dentro de un filtro, y las condiciones del filtro se están acumulando como queremos. Ahora aquí viene mi problema.
He escrito una función para calcular los números primos relativos de un número. Se ve así:
def relative_primes(num):
'''Returns a list of relative primes, relative to the given number.'''
if num == 1:
return []
elif is_prime(num):
return list(range(1, num))
result = range(1, num)
for factor in prime_factors(num):
# Why aren't these filters stacking properly?
result = filter(lambda n: n % factor != 0, result)
return list(result)
Por alguna razón, sólo se está aplicando el filtro para el factor último de la lista adquirido de prime_factors(). Ejemplo:
>>> prime_factors(30)
[2, 3, 5]
>>> relative_primes(30)
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29]
Podemos ver que no se eliminaron múltiplos de 2 o 3 de la lista. ¿Por qué está pasando esto? ¿Por qué funciona el ejemplo anterior, pero los filtros en el bucle for no?
Otra opción concisa es 'filter (factor .__ rmod__, result)', que, ciertamente, hace que el código sea menos legible. –