Seite 1 von 1

Permutationen

Verfasst: Dienstag 15. August 2023, 13:46
von hubgra
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?

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 13:50
von hubgra
sprachlich inkorrekt: eine Permutation ist ein Tupel

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 13:56
von __deets__
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.

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 14:59
von Sirius3
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

Code: Alles auswählen

for values in permutation([1,2,3,4]):
    print(values)
    ...
Deshalb merkt der Nutzer normalerweise gar nicht, dass die Werte on demand erzeugt werden.

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 16:52
von hubgra
Genau das habe ich getan (ich sehe die Permutationen), aber damit habe ich keinen Zugriff aif die i-te Permutation.

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 17:00
von hubgra
So geht es, aber warum so umständlich?


perm = permutations([1,2,3,4])
L = list(perm)
print(L[0][0])

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 17:04
von Sirius3
Bei Permutationen gibt es keine Ordnung, damit macht die Frage nach der i-ten Permutation keinen Sinn. Für was glaubst Du, die i-te Permutation zu brauchen?

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 17:23
von hubgra
Aber eine Liste hat Indizes. Ich will geeignete Permutations-Einträge in 2x2-Blöcken in eine 4x4-Matrix eintragen, so dass in jeder Zeile/Spalte eine Permutation steht (vgl. Sudoku). Aber womöglich gibt es das schon.

Re: Permutationen

Verfasst: Dienstag 15. August 2023, 18:19
von __deets__
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.

Re: Permutationen

Verfasst: Mittwoch 16. August 2023, 21:23
von Dennis89
Hallo,

um auf folgendes noch mal zurück zu kommen:
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])
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.
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