ubuntuusers.de

Permutation von Listen in Python

Status: Gelöst | Ubuntu-Version: Kubuntu 10.04 (Lucid Lynx)
Antworten |

vuxi

Anmeldungsdatum:
9. November 2007

Beiträge: 187

Hallo

ich habe Listen verschiedener vorher unbekannter Länge. Die werden erst im Programmablauf erzeugt.

A = (1,2,3,4,5)

B = (21,22,23)

C = (12,13,14,15)

was ich am Schluss brauche sind alle Kombinationen folgender Art

D = (x,y,z)

mit x € A , y € B , z € C

Ich kann natürlich diverse Schleifen ineinander bauen (geht nicht nur um 3 Listen) aber geschickt erscheint mir das nicht. Gibts da irgendeine schlauerer Lösung ?

vuxi

Barabbas

Avatar von Barabbas

Anmeldungsdatum:
31. März 2007

Beiträge: 1651

Wohnort: Münster

Itertools ist vermutlich, was du suchst:

list(itertools.permutations([1,2,3,4]))

Ansonsten gibt es unter dem Stichwort "python permutation" echt extrem viel - sogar ein YT-Video 😉.

Schöne Grüße, ich hoffe, das war, was du suchtest.

brb

//edit:
Die Funktion list() ist natürlich überflüssig, wenn du über das Ergebnis iterieren möchtest.

vuxi

(Themenstarter)

Anmeldungsdatum:
9. November 2007

Beiträge: 187

Barabbas schrieb:

Itertools ist vermutlich, was du suchst:

list(itertools.permutations([1,2,3,4]))

Ansonsten gibt es unter dem Stichwort "python permutation" echt extrem viel - sogar ein YT-Video 😉.

Schöne Grüße, ich hoffe, das war, was du suchtest.

brb

//edit:
Die Funktion list() ist natürlich überflüssig, wenn du über das Ergebnis iterieren möchtest.

Ne leider nicht. Das Ding spuckt mir ja nur die Permutation der vier Zahlen aus ( 1,2,3,4 ). Ich habe für jede Stelle des Vektors eine Liste an Zahlen. Die Zahlen sollen jeweils nur an dieser Stelle vorkommen. Und davon will ich alle Kombinationen

Beispiel

A = (1,2)

B = (3,4)

–>

C1 = (1,3)

C2 = (1,4)

C3 = (2,3)

C4 = (2,4)

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi vuxi,

... diverse Schleifen ineinander bauen .. aber geschickt erscheint mir das nicht.

Warum nicht ? - über die verschiedenen Komponenten iterieren musst Du sowieso, egal ob implizit durch eine Bibliothek oder ausdrücklich in einem Skript.
Und die Anzahl Verktoren bleibt auch die selbe.

Vom Tempo her macht das wenig aus, selbst bei einem bash-Skript. (btw. - in welcher Sprache willst Du das eigentlich programmieren ?) (siehe unten)
Jedenfalls würde ich auch nur einfach 3 for-Schleifen schachteln und fertig.

Wenn so ein Programm zu lahm läuft, könnte man am ehesten durch zusammenfassen ähnlicher Vektoren etwas optimieren, auf der Ebene.

LG,

track

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

track schrieb:

(btw. - in welcher Sprache willst Du das eigentlich programmieren ?)

In Python - steht auch im Titel 😉

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Sorry, ich glaube meine Brille war beschlagen ... 😳

track

vuxi

(Themenstarter)

Anmeldungsdatum:
9. November 2007

Beiträge: 187

Es ging mir auch nicht um die Geschwindigkeit. Das Programm wird nicht so oft genutzt werden, dass es darauf ankommt. Wollte eigentlich nur wissen ob man das eleganter lösen kann, um eventuell anderen Leuten die das Ding mal umschreiben wollen (z.B. den Vektor um ein paar Komponenten erweitern) die Arbeit zu erleichtern.

track schrieb:

Jedenfalls würde ich auch nur einfach 3 for-Schleifen schachteln und fertig.

Es geht mindestens um 6 Einträge im Vektor und damit mindestens 6 geschachtelte Schleifen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

Das heißt dann nicht Permutation, sondern Kreuzprodukt, oder?

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

1
2
>>> list(itertools.product((1,2), (3,4)))
[(1, 3), (1, 4), (2, 3), (2, 4)]

vuxi

(Themenstarter)

Anmeldungsdatum:
9. November 2007

Beiträge: 187

Herzlichen Dank. Das ist genau das was ich gesucht habe.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

user unknown schrieb:

Das heißt dann nicht Permutation, sondern Kreuzprodukt, oder?

Jupp, oder auch kartesisches Produkt genannt. Genau dafür ist itertools.product() gemacht worden.

vuxi

(Themenstarter)

Anmeldungsdatum:
9. November 2007

Beiträge: 187

Ja ich stell mich auch in die Ecke. Aber die letzte Mathevorlesung ist auch einige Jahre her ☺

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

vuxi schrieb:

Ja ich stell mich auch in die Ecke. Aber die letzte Mathevorlesung ist auch einige Jahre her ☺

Ich wollt schon sagen. Du hast dich mit dem Begriff "Permutation" hier ein bißchen vertan. 😉

Antworten |