Aus einem List-Objekt alle möglichen Kombinationen ableiten

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
uweddf
User
Beiträge: 12
Registriert: Freitag 30. August 2013, 10:28

Hallo,

ich habe ein List-Objekt.

Ausgangs-Objekt : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

Aus diesem Objekt möchte ich jetzt alle möglichen 6er Kombinationen,
als jeweils neues List-Objekt ableiten, wobei keine 6er Kombination doppelt vorkommen darf.
Mir ist Bewusst, dass dies einige 100.000 neue List-Objekte als Ergebnis sein werden.

Doppelt wäre zum Beispiel :
[1,2,3,4,5,6] == [6,5,4,3,2,1] oder
[1,2,3,4,5,6] == [3,2,1,4,5,6] usw.

Richtig wäre:
[1,2,3,4,5,6],
[1,2,3,4,5,7],
[1,2,3,4,5,8],
.
[6,12,13,16,17,18]
.
[13, 14, 15, 16, 17, 18]

Ich habe einige Versuche mit verschachtelten for schleifen unternommen,
jedoch waren deren Ergebnisse alle völlig unbrauchbar.

Ich habe jetzt überhaupt keine Idee mehr, wie ich dieses noch sinnvoll lösen könnte.
Über ein klein wenig Hilfe würde ich mich sehr freuen. Vielen Dank.
DaftWullie
User
Beiträge: 37
Registriert: Donnerstag 17. Mai 2012, 21:28

Suchst du vielleicht combinations aus der itertools library?
uweddf
User
Beiträge: 12
Registriert: Freitag 30. August 2013, 10:28

@DaftWullie

Das sieht schon einmal viel besser aus, als meine Versuche.

Ich werde es damit probieren.
Vielen Dank
BlackJack

@uweddf: Einige 100.000 ist ein wenig übertrieben. Bei dem Beispiel sind es nur 18.564 Kombinationen. :-)

Edit: Die Rechnung vergessen:

Code: Alles auswählen

In [23]: math.factorial(18) / (math.factorial(6) * math.factorial(18 - 6))
Out[23]: 18564L
uweddf
User
Beiträge: 12
Registriert: Freitag 30. August 2013, 10:28

@BlackJack:

Ich war gerade im Keller und habe meinen HP-Taschenrechner mal wieder ausgepackt und siehe da, Du hast recht.

Obwohl mein HP der Meinung ist, das es nur 18.563 Kombinationen sind.

Da die Differenz zu 100.000 jedoch so erheblich ist, würde diese eine Kombination den Braten jetzt nicht wirklich fett machen.

Danke.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

uweddf hat geschrieben:Obwohl mein HP der Meinung ist, das es nur 18.563 Kombinationen sind.
Dann lügt dein Taschenrechner, ist nicht genau genug oder du hast dich ganz einfach vertan.
Das Leben ist wie ein Tennisball.
uweddf
User
Beiträge: 12
Registriert: Freitag 30. August 2013, 10:28

@EyDu:

Mein Taschenrechner lügt nie und ungenau ist er in den letzten 30 Jahren auch noch nie gewesen.

Somit ergibt sich, da ich 2 von 3 Möglichkeiten ausschließen konnten, das es eindeutig am User liegt.

Obwohl - wurde das math Modul nicht von einem Amerikaner entworfen ? Dann müssten die vorgegebenen
Möglichkeiten anders gewichten werden. Aber ich sehe gerade, dass HP made in Italy ist und dieses
gleicht das keinesfalls aus. Somit zählt das Unvermögen des Users doppelt und macht das Ergebnis nun
endgültig eindeutig.

mfg.
uweddf
User
Beiträge: 12
Registriert: Freitag 30. August 2013, 10:28

Hallo,

ich habe die Anzahl erstellter Listen mit len(list(itertools.combinations(xrange(18), 6))) geprüft und siehe da,
es sind genau 18.564.

Somit ist
math.factorial(18) / (math.factorial(6) * math.factorial(18 - 6)) == len(list(itertools.combinations(xrange(18), 6)))

somit sind alle Fragen eindeutig beantwortet.

vielen Dank.
BlackJack

@uweddf: Was hast Du denn für einen HP? Mein 48G kommt auf die korrekten 18.564 wenn ich ``18 6 COMB`` eingebe. Sowohl das Originalgerät als auch der Emulator (Droid48) den ich auf dem Smartphone installiert habe weil ich mich an den Taschenrechner so gewöhnt habe. :-)

Edit: Auch wenn ich die Formel manuell ausrechne (``18 ! 6 ! 18 6 - * /``) kommt das richtige Ergebnis heraus.
Antworten