Seite 1 von 1

Listenkombinatorik

Verfasst: Freitag 12. April 2019, 10:39
von Freumel
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.

Re: Listenkombinatorik

Verfasst: Freitag 12. April 2019, 10:44
von __deets__
Einfach deine Teillisten zu permutieren und dann erst zu kombinieren klappt nicht weil....?

Re: Listenkombinatorik

Verfasst: Freitag 12. April 2019, 10:48
von Freumel
__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. :|

Re: Listenkombinatorik

Verfasst: Freitag 12. April 2019, 10:57
von Sirius3
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).