Ich habe eine Liste mit 15 Zahlen, und ich muss einen Code schreiben, der alle 32.768 Kombinationen dieser Zahlen erzeugt.
Ich habe gefunden einige Codes (durch Googeln), die anscheinend tut, was ich suche, aber ich fand den Code ziemlich undurchsichtig und bin vorsichtig, es zu benutzen. Außerdem habe ich das Gefühl, dass es eine elegantere Lösung geben muss.
Das Einzige, was mir einfällt, wäre, einfach eine Schleife durch die Dezimalzahlen 1-32768 zu ziehen und diese in Binärzahlen umzuwandeln, und die Binärdarstellung als Filter zu verwenden, um die entsprechenden Zahlen herauszufiltern.
Kennt jemand einen besseren Weg? Verwendung von map()
vielleicht?
18 Stimmen
Die Leserinnen und Leser sollten beachten, dass unabhängig davon, ob es sich bei den Listenpunkten um einzigartig ist eine extrem wichtige Überlegung, da viele Algorithmen dann einige Teilmengen überzählen (z. B. 'abccc' -> ['', 'a', 'b', 'c', 'c', 'c', 'ac', 'ac', 'ac', ...]. Eine einfache Abhilfe besteht darin, alle Elemente in eine Menge zu schieben vor ihre Permutationen zu erhalten.
0 Stimmen
@ninjagecko Die Verwendung der Set-Bibliothek ist nicht effizient, da sie im besten Fall O(n) ist. Das Hinzufügen von n Funktionen zu einer Menge ist also tatsächlich O(n^2)!
3 Stimmen
Nach sorgfältiger Lektüre der Frage scheint es so, als ob der Fragesteller nach dem PowerSet seiner Liste von 15 Zahlen, nicht alle Kombinationen. Ich glaube, das ist der Grund, warum die Antworten so unterschiedlich ausfallen.
0 Stimmen
@Scott Biggs: Sind Sie sicher, dass Sie sich hier auf Python beziehen? Das Einfügen von Mengen und das Nachschlagen sind O(1) im durchschnittlichen Fall. Sie sind wie Wörterbücher. Sie verwenden Hashing. Python hat keine spezielle Mengenbibliothek (sie ist in der Standardbibliothek enthalten). Wir fügen hier Zahlen ein, keine Funktionen. (Es wäre immer noch ineffizient, O(2^n) Speicher zu verwenden; die richtige Lösung für Leute, die eher Kombinationen als die Potenzmenge wollen, ist eine einfache rekursive Implementierung, oder
product
, usw.)0 Stimmen
Siehe auch stackoverflow.com/questions/10342939/ .