Listenkombinatorik

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
Freumel
User
Beiträge: 69
Registriert: Donnerstag 25. Januar 2018, 13:47

Hallo zusammen,

ich habe ein "kleines" Anliegen.
Es existieren die Listen

Code: Alles auswählen

a = [1,2,3,4]
b = [5,6,7,8]
die füge ich zu einer Liste zusammen:

Code: Alles auswählen

c = a + b
Das hieße für c = [1,2,3,4,5,6,7,8]

Ich möchte nun die Einträge untereinander vertauschen:

Code: Alles auswählen

import itertools
combinations = list(iterools.permutations(c)
Das liefert mir natürlich eine Liste der Länge 8!.
Im Anwendungsfall arbeite ich allerdings mit zwei Listen der Länge 10. Das liefert in den Permutationen 20! Möglichkeiten ...
Verrückt.

Jetzt habe ich aber den Luxus von Regeln. Es sind nicht alle Kombinatoriken erlaubt.
In den Permutationen dürfen die Zahlen von a oder b nicht vertauscht werden.
Folgende Ergebnisse für das Beispiel sind also legitim:

Code: Alles auswählen

combination1 = [1,2,3,4,5,6,7,8]
combination2 = [1,2,3,5,4,6,7,8]
combination3 = [1,2,5,3,6,4,7,8]
usw.

Die Längen der Inputs sind dabei immer irgendwo zwischen 8 und 12. Insgesamt also eine Länge von 16 - 24.

Gibt es eine variable Möglichkeit diesen Sachverhalt umzusetzen?
Habe selbst leider keine vernünftige Idee mehr.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Einfach deine Teillisten zu permutieren und dann erst zu kombinieren klappt nicht weil....?
Freumel
User
Beiträge: 69
Registriert: Donnerstag 25. Januar 2018, 13:47

__deets__ hat geschrieben: Freitag 12. April 2019, 10:44 Einfach deine Teillisten zu permutieren und dann erst zu kombinieren klappt nicht weil....?
Was wäre denn eine Teilliste?
Jede Permutation vertauscht auch die Reihenfolge untereinander.

Oder meinst du sowas:

Code: Alles auswählen

c1 = [ [1,2],[5,6] ]
Mir fehlt ein wenig die Phantasie das umzusetzen. :|
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast keine Permutation von Listeneinträgen, sondern eine von Listenauswahl.
Du mußt die Liste [L1, L1, L1, L1, L2, L2, L2, L2] permutieren und identische Listen ignorieren.
Oder Du willst wissen, an welchen Indizes Du die Werte der ersten Liste und an welchen der zweiten Liste eintragen sollst, also:

Code: Alles auswählen

itertools.combinations(range(len(a)+len(b)), len(a))
und Du erhältst eine Liste, wo a-Einträge landen sollen und sonst b-Einträge:
Beispiel als ein Schritt von combinations: (1, 2, 5, 7) bedeutet eine Liste [b[0], a[0], a[1], b[1], b[2], a[2], b[3], a[3]], also an den Indexwerten von 1, 2, 5 und 7 landen die Einträge aus Liste a sonst Liste b. (Das zu Programmieren ist irgendwie einfacher, als es zu erklären).
Antworten