Permutationen bestimmen?
Ich brauche für ein Projekt alle Permutationen der Zahlen 1-12 und habe dafür folgendes Programm:
from itertools import permutations
zahlen = list(range(1, 13))
kombinationen = list(permutations(zahlen, len(zahlen)))
with open('kombinationen.txt', 'w+') as datei:
datei.truncate(0) # Die Datei leeren, falls bereits vorhanden
for kombination in kombinationen:
datei.write(', '.join(map(str, kombination)) + '\n')
Ich bekomme jedoch einen Memory Error wenn ich es ausführe, deshalb meine Frage: Lässt sich das irgendwie sinnvoll in mehrere Teile aufteilen, sodass jedes Mal kleinere "Portionen" berechnet werden?
Vielen Dank
1 Antwort
Der ganze Witz der Itertools ist es, mit Iteratoren bzw. Generatoren zu arbeiten, d.h. ohne alles erst in eine komplette Liste auszuwalzen. Du sabotierst das aber ziemlich gründlich, weil du doch das Bauen einer gigantischen Liste erzwingst:
kombinationen = list(permutations(zahlen, len(zahlen)))
Also weg damit (und noch ein paar Kleinigkeiten aufgeräumt), und schon passiert ganz von selbst, was du wolltest:
from itertools import permutations
zahlen = list(range(1, 13))
kombinationen = permutations(zahlen, len(zahlen))
with open('kombinationen.txt', 'w') as datei:
for kombination in kombinationen:
datei.write(', '.join(str(num) for num in kombination) + '\n')
Von Python aus nicht so einfach, weil die Zahl der Zeilen nicht von vornherein bekannt ist. Wenn du auf Linux oder MacOS arbeitest, lass dir die große Datei einfach mit split in kleinere aufteilen. Ich vermute, sowas gibt's auch irgendwo für Windows.
Wobei ich mich ein wenig frage, wofür die Datei im Texteditor öffnest - solche Riesendinger wird man doch eher programmatisch bearbeiten?
wobei man die Zahl der Zeilen ja vorher mit 12! berechnen könnte
Stimmt natürlich, ich meinte hier eher, dass man den gegebenen Datenstrukturen keine "Länge" entlocken kann. Man könnte klarerweise eine große Schleife drumherum legen und damit einzelne Dateien numeriert anlegen. Ich find's aber trotzdem einfacher, nötigenfalls nachher einen Einzeiler mit "split" zu machen.
Fürs "Nachschauen" tut es üblicherweise cat / more / less oder solche Tools.
Vielen Dank für die Antwort, hat perfekt funktioniert! Ich habe gerade erst angefangen damit zu arbeiten deswegen entschuldige meine Dummheit :)
eine Frage hätte ich noch: die Datei die dabei entsteht ist zu groß um sie mit Texteditoren zu öffnen, gibt es eine Möglichkeit die Zahlen in mehreren, kleineren Dateien abzuspeichern? Vielen Dank