2017-12-17 3 views
1
def powerset(x): 
    total1 = [[]] 
    total2 = [[]] 
    for a in x: 
     for b in total1: 
      c = list(b + [x[a]]) 
      total2.append(c) 
     total1 = total2 
     # the total 1 and total 2 system should prevent it 
     # from creating an infinite loop when we add to the total. 

     print (total1) 

f = [1,2,3] 
g = powerset(f) 
print (g) 

Hier ist mein Versuch, ein Powerset für ein Intro Data Science-Klasse zu erstellen. Wenn ich das ausführe, erhalte ich als Ausgaben, bevor der Speicher ausgeht. Ich verstehe nicht, warum es [[], [2]] zurückgibt, noch warum es nicht genügend Speicher hat, da Summe 1 außerhalb der Schleife geändert wird.Powerset-Funktion nicht genügend Arbeitsspeicher

g sollte einen Leistungssatz von f zurückgeben.

könnte jemand erklären, was ich falsch mache?

+4

'für eine in x 'iss * nicht * iteriert über * Indizes *, sondern über die Elemente in' x'. –

Antwort

1

Nach der ersten Schleife Sie total1 = total2 eingestellt, so dass bedeutet, dass total1 und total2 auf derselben Liste nach.

Und so iterieren Sie in der zweiten Schleife über total1 und aktualisieren total2, die gleiche Liste. In Python (und in den meisten Programmiersprachen) ist es gefährlich, alter eine Sammlung Sie iterieren über, so dass Sie fügen Sie Elemente auf der Liste, so dass die Schleife länger und länger.

Der Code ist nicht per se problematisch. Wir können schreiben Sie es als:

def powerset(x): 
    result = [[]] 
    for xi in x: 
     xil = [xi] 
     for j in range(len(result)): 
      result.append(result[j] + xil) 
    return result 

Obwohl es wie einige syntaktische Neufassungen aussehen, hier wir j über die range(len(result)) laufen. Beachten Sie, dass wir len(result)nur einmal berechnen, wenn wir die for Schleife starten, können wir danach sicher total aktualisieren, da sich das Bereichsobjekt nicht mehr ändert.

Diese dann ergibt sich:

>>> powerset([1,2,3]) 
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] 

Beachten Sie, dass wir die itertools.combinations Funktion erleichtern das Leben verwenden können:

from itertools import combinations 

def powerset(x): 
    xl = list(x) 
    for r in range(len(xl)+1): 
     for ri in combinations(xl, r): 
      yield ri 

Wir erhalten dann:

>>> list(powerset([1,2,3])) 
[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] 
+0

Dies könnte außerhalb des Bereichs der Frage liegen, aber ich hatte den Eindruck, dass, wenn Sie die beiden gleichsetzen, sie nicht zusammen aktualisieren, I.E. 'a = 1, b = a, b + = 1, drucke a 'druckt' 1 'statt 2? – sumguy

+0

Das liegt daran, dass 'int' unveränderbar sind, also fällt Python auf' __add__' zurück. Listen sind veränderbar. –

Verwandte Themen