Ich habe mit
perm = permutations([1,2,3,4])
alle Permutationen erzeugt und kann sie ansehen, die aus perm erzeugte Liste hat die Länge 24 (kein Wunder):
print(list(perm))
Aber der Versuch
p = list(perm)[0]
führt zur Meldung
IndexError: list index out of range
Wie kann ich denn auf eine einzelne Permutation (das sind Tupel) zugreifen?
Permutationen
Da Permutationen sehr viel werden koennen, ist permutations in itertools (wie alle anderen Hilfsmittel in dem Modul) "lazy evaluated", soll heissen: es produziert seine Elemente auf Anfrage, potentiell sogar unendlich viele davon (zb bei itertools.cycle). Das Prinzip nennt sich auch Generator.
Und jetzt hast du also so einen Generator in der Hand, und mit list(perms) hast du ihn alles produzieren lassen, was er so beinhaltet. Danach ist er leer. Nochmal list(perm) aufzurufen, hat also die leere Liste zur folge.
Spar dir einfach wahlweise das print, oder das anlegen von perm, statt gleich einfach an beiden Stellen permutations(...) zu benutzen.
Und jetzt hast du also so einen Generator in der Hand, und mit list(perms) hast du ihn alles produzieren lassen, was er so beinhaltet. Danach ist er leer. Nochmal list(perm) aufzurufen, hat also die leere Liste zur folge.
Spar dir einfach wahlweise das print, oder das anlegen von perm, statt gleich einfach an beiden Stellen permutations(...) zu benutzen.
Alle Permutationen erzeugen zu lassen, nur um dann den ersten Wert zu nehmen und alle anderen wegzuschmeißen ist Verschwendung.
Generatoren werden normalerweise in einer Schleife benutzt, also
Deshalb merkt der Nutzer normalerweise gar nicht, dass die Werte on demand erzeugt werden.
Generatoren werden normalerweise in einer Schleife benutzt, also
Code: Alles auswählen
for values in permutation([1,2,3,4]):
print(values)
...
Das mit Permutationen zu machen, ist doch hoch verschwenderisch. Wenn du auch nur eine Zelle belegt hast, stellt die ja schon einen Constraint fuer alle umliegenden Elemente zeilen/spaltenweise dar. Die dann aus der Menge der Permutationen von 10**3 kommen, eine ganze Groessenordung kleiner als bisher.
Wenn du ein Sudoku-Generator bauen willst, wuerde man das eher durch eine sukkzessive Einschraenkung der Freiheitsgrade jedes Elements machen. Jede Festlegung eines Elements entfernt dieses als Moeglichkeit der drei relevanten Teilbereiche.
Wenn du ein Sudoku-Generator bauen willst, wuerde man das eher durch eine sukkzessive Einschraenkung der Freiheitsgrade jedes Elements machen. Jede Festlegung eines Elements entfernt dieses als Moeglichkeit der drei relevanten Teilbereiche.
Hallo,
um auf folgendes noch mal zurück zu kommen:
Ich habe gerade mal etwas gesucht, aber eine schöne Erklärung zu Generatoren habe ich nicht gefunden, ich lasse dir trotzdem mal zwei Links da, vielleicht kannst du verstehen, wie "pem" erzeugt wird und was es ist.
https://stackoverflow.com/questions/175 ... -in-python
https://wiki.python.org/moin/Generators
Hier noch der Code zu "Permutations":
https://docs.python.org/3/library/itert ... rmutations
Grüße
Dennis
um auf folgendes noch mal zurück zu kommen:
Das hatte @__deets__ schon geschrieben, nach "list(pem)" ist "pem" leer. Deswegen musst du die Liste erst an einen weiteren Namen binden und kannst dann auf den Index der Liste zugreifen.hubgra hat geschrieben: Dienstag 15. August 2023, 17:00 So geht es, aber warum so umständlich?
perm = permutations([1,2,3,4])
L = list(perm)
print(L[0][0])
Ich habe gerade mal etwas gesucht, aber eine schöne Erklärung zu Generatoren habe ich nicht gefunden, ich lasse dir trotzdem mal zwei Links da, vielleicht kannst du verstehen, wie "pem" erzeugt wird und was es ist.
https://stackoverflow.com/questions/175 ... -in-python
https://wiki.python.org/moin/Generators
Hier noch der Code zu "Permutations":
https://docs.python.org/3/library/itert ... rmutations
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]