alle möglichen Länge k-Kombinationen einer string in python
Ich würde gerne alle möglichen Kombinationen der Buchstaben in einem string mit der Länge k. Ich weiß es gibt viele Beiträge zu diesem Thema, aber ich habe ein wenig verdrehen, k ist größer als die Länge der Zeichenfolge.
Dies ist, was ich habe, so weit, seine einfach, und es funktioniert, wenn k <= len(string):
string = 'ABCD'
permutations = ["".join(x) for x in itertools.permutations(string, k)]
Ergebnisse, wenn k = 4:
['ABCD', 'ABDC', 'ACBD', 'ACDB', 'ADBC', 'ADCB', 'BACD', 'BADC', 'BCAD', 'BCDA',
'BDAC','BDCA', 'CABD', 'CADB', 'CBAD', 'CBDA', 'CDAB', 'CDBA', 'DABC', 'DACB',
'DBAC', 'DBCA', 'DCAB', 'DCBA']
Diese wie erwartet funktioniert. Ich möchte jedoch alle möglichen Kombinationen dieser vier Buchstaben, mit k > len(string).
Beispiel Antwort, die ich gerne sein würde:
string = 'AB'
k = 4
result = ['AAA,'ABB','AAB', 'ABA','BBB', 'BAA'.......]
Vielen Dank im Voraus.
- Es gibt 4^15 strings der Länge 15, bestehend aus A, B, C und D. Das sind über eine Milliarde - strings. Natürlich Ihr computer verklemmt sich. (Beachten Sie, dass es gibt eine Billion Permutationen von 15 Elementen, das ist, was Sie gebeten, Ihren computer zu berechnen)
- Sie sollten ein Beispiel geben von dem, was die Ausgabe, die Sie sehen wollen.
- rechten, Weg, SO kann eingeklemmt werden bis zu verarbeiten versucht eine multi-GB HTTP POST, anstatt nur die Fragesteller die computer verklemmt sich 😉
- Ich bin mir relativ sicher, dass so ein POST fehlschlagen würde. Zumindest hoffe ich so. (plötzlicher Drang zu versuchen)
- Beachten Sie, dass
itertools.permutations
ist, geben Sie die Anzahl der gut.... Permutationen, Kombinationen nicht. Nachdem, was @nneonneo sagte, wenn Sie erlauben wiederholten Buchstaben m^n möglichen strings der Länge n, mit m Symbolen. Gegeben ein string s der Länge n, gibt es n! (Fakultät) Permutationen von s. Eine permutation ist eine Neuordnung, die verwendet jeder der ursprünglichen Elemente nur einmal. - Ok ja, das ist der Grund, warum es verklemmt sich Sinn macht. Sorry ich bin sehr neu in der Programmierung. Eine andere Möglichkeit wäre, um nicht zu speichern und alle Kombinationen. Ich bin versucht, suchen eine sehr große string für die Anzahl der vorkommen jeder Kombination und sehen, welche Kombination tritt am häufigsten auf.
- Dann bitten. Don ' T fallen in die Falle des X/Y-problem. (Wenn Sie tatsächlich überprüfen Sie jede einzelne Kombination, Ihr Speicher und CPU-Zeit explodieren. Es gibt viel, viel einfachere Wege).
- Das Beispiel, das Sie Gaben mit
'AB'
undk = 4
nicht der gleichen Logik Folgen wie die, die Sie gab mit'ABCD'
undk = 4
. Ich finde das irreführend. Ich blieb mit der Auslegung der letzteren zu bauen, meine Antwort. - Ihre Beispiele scheinen nicht zu entsprechen. Sie haben
'AAA'
im Beispiel am Ende, aber Sie haben nicht'AAAA'
in der Ausgabe vompermutations
- code, den Sie sagen, ist richtig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie möglicherweise
statt. Probieren Sie es aus! Deine Beschreibung ist unzureichend definiert, so nicht erraten können, das ist sicher.
Beispiel:
itertools
zum Teil ist das generieren von Sequenzen, die zu groß für den Speicher.Basierend auf Ihren Kommentar:
Gibt es eine andere Möglichkeit, das zu tun, was Sie wollen:
Können Sie sich dann zu machen, diese grundlegende Idee effizienter: zum Beispiel, wenn Sie Begegnung ein
'x'
Charakter invlarge
dann wissen Sie, dass keiner von den Teilstrings gehören, die es werden Kombinationen von'abcd'
. So können Sie überspringen der substring beginnt, dass ein Ort nach demx
:Verglichen mit diesem Ansatz, der "offensichtlich" Idee (iterieren über alle Kombinationen, zu zählen, wie oft Sie erscheinen als ein substring, und verfolgen Sie den besten bisher) weniger Speicher verbraucht wird aber eine viel langsamer, da es sich um viel der Pässe über die sehr große string.
Wenn ich falsch verstanden habe was du meinst mit "Kombinationen", das heißt, wenn mein
uses_only
- Funktion falsch ist, dann müsstest du die Lautstärke meiner Vorstellung entsprechend. Der Punkt ist: die Zahl der tatsächlichen Teilzeichenketten der form, die Sie wollen, da gibt es weniger von Ihnen gibt als hypothetische Teilstrings der richtigen form.Meine Antwort nur eine theoretische Analyse von dem, was Sie tun.
Ich bezeichne die binomial-Koeffizienten definieren die Anzahl der Teile mit k Elemente einer Reihe mit n Elemente von C(k,n).
Angenommen, Sie haben einen string der Länge n ∈ zahlen ℕ* und k ∈ zahlen ℕ, k ⩾ n. Ich werde annehmen, dass alle Zeichen im string sind deutlich.
Ich habe verstanden, dass Sie versuchen, erstellen Sie eine Zeichenfolge von k Zeichen extrahiert aus Ihrem input-string.
Eine Kombination aus string Zeichen gesehen werden kann als eine permutation ⟦1, n⟧. Es gibt n! solche Permutationen ...
Dann, wenn k > n, sind die Dinge immer viel schlimmer ... Lass r = k mod n und p = (k - r)/n. Offensichtlich haben wir :
Ihre Ausgabe-string kann es zerlegt werden in p "komplette" Teilzeichenfolgen aus einer permutation von Ihrem n Zeichen eingeben, und einen substring aus nur r Zeichen der Eingabezeichenfolge.
So bauen Sie einen "unvollständigen" substring, müssen Sie zuerst wählen Sie eine Teilmenge von r Zeichen der Eingabe-Zeichenfolge und dann eine permutation von solchen Charakteren. Endlich, die Reihe sr,n, um mögliche unterfolgen :
Beachten Sie, dass diese Formel führt nicht zu einer ungültigen Globale Ergebnis, wenn r = 0, da C(0,n) = 1 und 0! = 1 per Konvention.
Die endgültige Zahl der k-lange strings können Sie bauen nach Ihren Schema :
Diese Zahl ist unverschämt hoch !
Mit k = 4 und n = 2 haben wir :