Permutationen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

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?
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

sprachlich inkorrekt: eine Permutation ist ein Tupel
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Genau das habe ich getan (ich sehe die Permutationen), aber damit habe ich keinen Zugriff aif die i-te Permutation.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

So geht es, aber warum so umständlich?


perm = permutations([1,2,3,4])
L = list(perm)
print(L[0][0])
Sirius3
User
Beiträge: 18273
Registriert: Sonntag 21. Oktober 2012, 17:20

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?
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
Dennis89
User
Beiträge: 1555
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten