0

EDIT: Obwohl ich im ursprünglichen Beitrag gesagt habe, dass ich Listenverständnis verwenden möchte, würde ich gerne jede Lösung akzeptieren. Ich nahm einfach an, dass das Listenverständnis der einfachste Weg wäre.Python Produkt einer beliebigen Anzahl von Variablen


Ich arbeite an einem Problem mit Primfaktorzerlegung, und habe ein Problem in Bezug auf Listenverständnis.

Ich habe eine Liste der Primfaktoren einer Zahl, und natürlich könnte die Liste eine beliebige Anzahl von Zahlen sein. Es könnte [2,3,5] oder nur [2] oder [2,3,11,17] usw. sein.

Was ich gerne tun könnte, wäre, alle Produkte von Mächten zu finden dieser Zahlen so, dass das Produkt kleiner oder gleich 100.000 ist. Wenn zum Beispiel meine Primfaktorzerlegung [2,3,5] ist, hätte ich gerne alle Zahlen der Form (2^a) (3^b) (5^c) für natürliche Zahlen a, b, c, befriedigend (2^a) (3^b) (5^c) < = 100.000.

Gibt es eine Möglichkeit, dies mit Listenverständnis zu tun, da die Anzahl der Primfaktoren willkürlich ist?

+1

Sie könnten es wahrscheinlich in ein Listenverstehen stecken, aber es wäre wahrscheinlich besser, es in eine Funktion (möglicherweise einen Generator) zu zerlegen. – BrenBarn

+1

Ich glaube nicht, dass es möglich ist Listenverstehen zu verwenden. Die Parameter sind zu weit gefasst, um sie in eine einzige Verständnisaussage zu stopfen. – James

+0

Können Sie eine Funktion definieren und in Ihrem Listenverständnis verwenden? – blacksite

Antwort

0

Überprüfen Sie dies.

import math 

Nmax = 100 
primeLst = [2, 3, 5] 


result = [] 
enumMax = [int(math.floor(math.log(Nmax)/math.log(i))) for i in primeLst] 

def prod(i, curRes): 
    if curRes > Nmax: 
     return 
    if i==len(primeLst): 
     result.append(curRes) 
    else: 
     for j in range(enumMax[i]+1): 
      prod(i+1, curRes * (primeLst[i]**j)) 

prod(0, 1) 

# result: [1, 5, 25, 3, 15, 75, 9, 45, 27, 81, 2, 10, 50, 6, 30, 18, 90, 54, 4, 20, 100, 12, 60, 36, 8, 40, 24, 72, 16, 80, 48, 32, 96, 64] 
+0

Sollte nicht '25' in den Ergebnissen seit' 2 ** 0 * 3 ** 0 * 5 ** 2 = 25' stehen? – niemmi

+0

Hoppla, bearbeitet. Vielen Dank!! – TurtleIzzy

1

Sie rekursive Funktion nutzen könnten, die einer der Faktoren nimmt und multipliziert die aktuelle Summe bis die Gesamtmenge über dem Grenzwert liegt. Für jede Iteration könnten Sie dann rekursiv dieselbe Funktion aufrufen, während Sie zum nächsten Faktor wechseln. Wenn Sie alle Faktoren ausgeschöpft haben nur die aktuelle Gesamtausbeute:

def prods(factors, limit, index = 0, total = 1): 
    # Base case, yield current number 
    if index >= len(factors): 
     yield total 
     return 

    while total <= limit: 
     # Python 3 yield from could be used 
     for res in prods(factors, limit, index + 1, total): 
      yield res 
     total *= factors[index] 

print list(prods([2, 3, 5], 100)) 

Ausgang:

[1, 5, 25, 3, 15, 75, 9, 45, 27, 81, 2, 10, 50, 6, 30, 18, 90, 54, 4, 20, 100, 12, 60, 36, 8, 40, 24, 72, 16, 80, 48, 32, 96, 64] 
0

Diese Modifikation der Antwort des @ niemmi heapq.merge jede der Sequenzen von jedem der rekursiven Aufrufe fusionieren verwendet, um produzieren, die Produkte in aufsteigender Reihenfolge:

from heapq import merge 

def prods(factors, limit, index = 0, total = 1): 
    # Base case, yield current number 
    if index >= len(factors): 
     yield total 
     return 
    iters = [] 
    while total < limit: 
     iters.append(prods(factors, limit, index + 1, total)) 
     total *= factors[index] 
    for res in merge(*iters): 
     yield res 

print list(prods([2, 3, 5], 100)) 

Es wird der Ausgang:

>>> print list(prods([2, 3, 5], 100)) 
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80, 81, 90, 96] 
Verwandte Themen