2016-11-06 9 views
0
import itertools 
printable = 'abcdefghijklmnopqrstuvwxz' 
all_possibilites = ([''.join(i) for i in itertools.product(printable, repeat = 3)]) 
comparison = ['zd'] 
if comparison in all_possibilities: 
    print("match") 

Dies ist ein Code-Schnipsel. Meine Absicht ist es, jede einzelne Kombination des Alphabets zu generieren. Das Snippet hat hier eine Grenze von drei Zeichen. Wenn das Limit zu groß ist, gibt Python einen Speicherfehler zurück. Meine Frage ist:Wie kann ich falsche Ergebnisse aus dem Speicher entfernen?

Gibt es eine Möglichkeit, aus dem Speicher die Kombinationen zu entfernen, die nicht übereinstimmten, damit die einzige Beschränkung Zeit statt Speicher ist? sagen, wenn das Zeichenlimit 5 war? Jede weitere Lektüre wäre hilfreich.

+0

Was genau ist der Zweck, den Sie erreichen möchten? Was meinst du mit allen möglichen Kombinationen des Alphabets? Es wird unendlich viele Kombinationen geben, wenn Sie die Wiederholungsgröße in Richtung Unendlichkeit erhöhen. Jede n-Buchstaben-Kombination, die du machst, existiert, also was ist der Zweck eines Vergleichs? Wenn ich itertools.product (Bereich (3), wiederholen = 3) haben Sie jede mögliche 3-stellige Kombination von 0,1 und 2 - Sie müssen nicht überprüfen, ob es existiert oder nicht. Natürlich füllt sich der Speicher schnell. Mit n = 5 haben Sie bereits 26^5 Kombinationen. – Daniel

Antwort

0

Der Hauptfehler ist, dass Sie zuerst die vollständige Liste erstellen und dann versuchen, sie herauszufiltern. Das ist ein Problem, weil Sie die vollständige Liste in den Speicher bringen.

Sie würden besser Ihre Kondition in der Liste Verständnis hinzufügen, halten alle Elemente Sie tatsächlich benötigen:

all_posibilities = ["".join(i) for i in itertools.product(printable, repeat = 5) if 'a' or 'b' in i] 
             ## ^^ place your condition here 
print(len(all_posibilities)) 

Alternativ, wenn Sie durch all_posibilities am Ende iterieren suchen, es Es ist sinnvoll, einen Generator zu erstellen, um den Speicherbedarf weiter zu begrenzen:

all_posibilities = ("".join(i) for i in itertools.product(printable, repeat = 5) if 'a' or 'b' in i) 
for i in all_posibilities: 
    # do things 
Verwandte Themen