Tengo una lista de Python de los factores primos de un número. ¿Cómo encuentro (pitónicamente) todos los factores?

Estoy trabajando en un problema del Proyecto Euler que requiere la factorización de un número entero. Puedo crear una lista de todos los números primos que son el factor de un número dado. El teorema fundamental de la aritmética implica que puedo usar esta lista para derivarcada factor del número.

Mi plan actual es tomar cada número en la lista de primos base y aumentar su potencia hasta que ya no sea un factor entero para encontrar los máximos exponentes para cada primo. Luego, multiplicaré todas las combinaciones posibles de pares primos-exponentes.

Entonces, por ejemplo, para 180:

Given: prime factors of 180: [2, 3, 5]
Find maximum exponent of each  factor: 
    180 / 2^1 = 90
    180 / 2^2 = 45
    180 / 2^3 = 22.5 - not an integer, so 2 is the maximum exponent of 2.

    180 / 3^1 = 60
    180 / 3^2 = 20
    180 / 3^3 = 6.6 - not an integer, so 2 is the maximum exponent of 3.

    180 / 5^1 = 36
    180 / 5^2 = 7.2 - not an integer, so 1 is the maximum exponent of 5.

Luego, haga todas las combinaciones de estas hasta el máximo exponente para obtener los factores:

    2^0 * 3^0 * 5^0 = 1
    2^1 * 3^0 * 5^0 = 2
    2^2 * 3^0 * 5^0 = 4
    2^0 * 3^1 * 5^0 = 3
    2^1 * 3^1 * 5^0 = 6
    2^2 * 3^1 * 5^0 = 12
    2^0 * 3^2 * 5^0 = 9
    2^1 * 3^2 * 5^0 = 18
    2^2 * 3^2 * 5^0 = 36
    2^0 * 3^0 * 5^1 = 5
    2^1 * 3^0 * 5^1 = 10
    2^2 * 3^0 * 5^1 = 20
    2^0 * 3^1 * 5^1 = 15
    2^1 * 3^1 * 5^1 = 30
    2^2 * 3^1 * 5^1 = 60
    2^0 * 3^2 * 5^1 = 45
    2^1 * 3^2 * 5^1 = 90
    2^2 * 3^2 * 5^1 = 180

Entonces la lista de factores = [1, 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180]

Aquí está el código que tengo hasta ahora. Dos problemas: Primero, no creo que sea muy pitónico. Me gustaría arreglar eso. Segundo yoDe Verdad no tengo una forma pitónica de hacer el segundo paso combinatorio. Por vergüenza, te he salvado del ridículo conjunto de bucles.

n es el número que queremos factorizar. listOfAllPrimes es una lista precalculada de los primos de hasta 10 millones.

def getListOfFactors(n, listOfAllPrimes):
    maxFactor = int(math.sqrt(n)) + 1
    eligiblePrimes = filter(lambda x: x <= maxFactor, listOfAllPrimes)
    listOfBasePrimes = filter(lambda x: n % x ==0, eligiblePrimes)

    listOfExponents = [] #(do I have to do this?)
    for x in listOfBasePrimes:
        y = 1
        while (x**(y+1)) % n == 0:
            y += 1
        listOfExponents.append(y)

Respuestas a la pregunta(6)

Su respuesta a la pregunta