Sie müssen Ihre permutierten Buchstaben jedoch als Zeichenfolgen verbinden.
['stack', 'stakc', 'stcak', 'stcka', 'stkac', 'stkca', 'satck', 'satkc', 'sactk', 'sackt', 'saktc', 'sakct', ' sctak ',' sctka ',' scatk ',' scakt ',' sckta ',' sckat ',' sktac ',' sktca ',' skatc ',' skact ',' skcta ',' skcat ',' tsack ' , 'tsakc', 'tscak', 'tscka', 'tskac', 'tskca', 'tasck', 'taskc', 'tacsk', 'tacks', 'taksc', 'takcs', 'tcsak', ' tcska ',' tcask ',' tcaks ',' tcksa ',' tckas ',' tksac ',' tksca ',' tkasc ',' tkacs ',' tkcsa ',' tkcas ',' astck ','astkc ',' asctk ',' asckt ',' asktc ',' askct ',' atsck ',' atskc ',' atcsk ',' atcks ',' atksc ',' atkcs ',' acstk ',' acskt ' , 'actsk', 'actks', 'ackst', 'ackts', 'akstc', 'aksct', 'aktsc', 'aktcs', 'akcst', 'akcts', 'cstak', 'cstka', ' csatk ',' csakt ',' cskta ',' cskat ',' ctsak ',' ctska ',' ctask ',' ctaks ',' ctksa ',' ctkas ',' castk ',' caskt ',' cat ' , 'catks', 'cakst', 'cakts', 'cksta', 'cksat', 'cktsa', 'cktas', 'ckast', 'ckats', 'kstac', 'kstca', 'ksatc',"ksact", "kscta", "kscat", "ktsac", "ktsca", "ktasc", "ktacs", "ktcsa", "ktcas", "kastc", "kasct", "katsc", "katcs" ',' kacst ',' kacts ',' kcsta ',' kcsat ',' kctsa ',' kctas ',' kcast ',' kcats ']
Wenn Sie Probleme mit Duplikaten haben, versuchen Sie, Ihre Daten in eine Struktur ohne Duplikate wie set
:
Vielen Dank an @pst für den Hinweis, dass dies nicht das ist, was wir traditionell als Typumwandlung betrachten, sondern eher als Aufruf an den set()
Konstruktor.
set(...)
"gießt" nicht. Vielmehr generiert (und liefert) es die Menge, die die Eingabesammlung darstellt: Einmal generiert, hat es keine Zuordnung zur Eingabesammlung (und ist ein anderes Objekt, nicht nur eine andere Ansicht).bool
als eine Funktion, die je nach Eingabe einen Bool (True / False) ergibt . Ich finde die Verwendung von "Besetzung" hier falsch und irreführend ...Sie können alle N bekommen! Permutationen ohne viel Code
quelle
step == len(string)
stattstep == len(string) - 1
?Hier ist eine andere Möglichkeit, die Permutation von Zeichenfolgen mit minimalem Code durchzuführen. Wir erstellen im Grunde eine Schleife und tauschen dann immer wieder zwei Zeichen gleichzeitig aus. Innerhalb der Schleife haben wir die Rekursion. Beachten Sie, dass wir nur drucken, wenn Indexer die Länge unserer Zeichenfolge erreichen. Beispiel: ABC i für unseren Startpunkt und unser Rekursionsparameter j für unsere Schleife
Hier ist eine visuelle Hilfe, wie es von links nach rechts von oben nach unten funktioniert (ist die Reihenfolge der Permutation)
der Code :
quelle
Stack Overflow-Benutzer haben bereits einige starke Lösungen veröffentlicht, aber ich wollte noch eine andere Lösung zeigen. Dieses finde ich intuitiver
Die Idee ist, dass für eine gegebene Zeichenfolge: wir können durch den Algorithmus (Pseudocode) rekursieren:
Ich hoffe es hilft jemandem!
quelle
Hier ist eine einfache Funktion, um eindeutige Permutationen zurückzugeben:
quelle
revursive_perms
->recursive_perms
. 2. Es würde RAM und Zeit sparen, wennrecursive_perms
eine Menge anstelle einer Liste wäre, die Sie in der set-Anweisung in eine Menge konvertieren. 3. Es wäre effizienter, String-Slicing.replace
zu verwenden, als das Argument für den rekursiven Aufruf von zu konstruierenpermutations
. 4. Es ist keine gute Idee,string
einen Variablennamen zu verwenden, da dies den Namen des Standardmodulsstring
überschattet.Hier ist ein anderer Ansatz als bei @Adriano und @illerucis. Dies hat eine bessere Laufzeit, Sie können dies selbst überprüfen, indem Sie die Zeit messen:
Für eine beliebige Zeichenfolge "dadffddxcf" dauerte die Permutationsbibliothek 1,1336 Sekunden, für diese Implementierung 9,125 Sekunden und für die Version von @ Adriano und @illerucis 16,357 Sekunden. Natürlich können Sie es trotzdem optimieren.
quelle
itertools.permutations
ist gut, aber es geht nicht gut mit Sequenzen um, die wiederholte Elemente enthalten. Dies liegt daran, dass es intern die Sequenzindizes permutiert und die Sequenzelementwerte nicht berücksichtigt.Sicher, es ist möglich, die Ausgabe
itertools.permutations
durch einen Satz zu filtern , um die Duplikate zu eliminieren, aber es verschwendet immer noch Zeit, diese Duplikate zu generieren, und wenn die Basissequenz mehrere wiederholte Elemente enthält, gibt es viele Duplikate. Die Verwendung einer Sammlung zum Speichern der Ergebnisse verschwendet außerdem RAM, wodurch der Vorteil der Verwendung eines Iterators in erster Linie zunichte gemacht wird.Glücklicherweise gibt es effizientere Ansätze. Der folgende Code verwendet den Algorithmus des indischen Mathematikers Narayana Pandita aus dem 14. Jahrhundert, der im Wikipedia-Artikel über Permutation zu finden ist . Dieser alte Algorithmus ist immer noch eine der schnellsten bekannten Methoden, um Permutationen in der richtigen Reihenfolge zu generieren, und er ist ziemlich robust, da er Permutationen, die wiederholte Elemente enthalten, ordnungsgemäß verarbeitet.
Ausgabe
Wenn Sie die erhaltenen Zeichenfolgen in einer Liste sammeln möchten, können Sie dies natürlich tun
oder in neueren Python-Versionen:
quelle
warum machst du nicht einfach:
Sie erhalten kein Duplikat, wie Sie sehen können:
quelle
quelle
Siehe
itertools.combinations
oderitertools.permutations
.quelle
Hier ist eine leicht verbesserte Version von illerucis 'Code zum Zurückgeben einer Liste aller Permutationen einer Zeichenfolge
s
mit unterschiedlichen Zeichen (nicht unbedingt in lexikografischer Sortierreihenfolge), ohne itertools zu verwenden:quelle
Hier ist eine wirklich einfache Generatorversion:
Ich denke es ist nicht so schlimm!
quelle
quelle
quelle
Dies ist eine Möglichkeit, Permutationen mit Rekursion zu generieren. Sie können den Code leicht verstehen, indem Sie die Zeichenfolgen 'a', 'ab' und 'abc' als Eingabe verwenden.
Du bekommst alle N! Permutationen damit, ohne Duplikate.
quelle
Jeder liebt den Geruch seines eigenen Codes. Ich teile nur die, die ich am einfachsten finde:
quelle
Dieses Programm beseitigt die Duplikate nicht, aber ich denke, es ist einer der effizientesten Ansätze:
quelle
quelle
Einfachere Lösung mit Permutationen.
quelle
Noch eine Initiative und rekursive Lösung. Die Idee ist, einen Buchstaben als Drehpunkt auszuwählen und dann ein Wort zu erstellen.
Ausgabe:
quelle
Alles mögliche Wort mit Stapel
Gibt aufeinanderfolgende r-Längenpermutationen von Elementen in der Iterable zurück.
Wenn r nicht angegeben ist oder None ist, wird r standardmäßig auf die Länge der iterierbaren Datei gesetzt und alle möglichen Permutationen in voller Länge werden generiert.
Permutationen werden in lexikografischer Sortierreihenfolge ausgegeben. Wenn also die iterierbare Eingabe sortiert ist, werden die Permutationstupel in sortierter Reihenfolge erzeugt.
Elemente werden aufgrund ihrer Position und nicht aufgrund ihres Werts als eindeutig behandelt. Wenn die Eingabeelemente eindeutig sind, gibt es in jeder Permutation keine Wiederholungswerte.
quelle
Dies ist eine rekursive Lösung, mit
n!
der doppelte Elemente in der Zeichenfolge akzeptiert werdenIch habe die Lösung unter Berücksichtigung von zwei Elementen validiert, die Anzahl der Kombinationen ist
n!
und das Ergebnis darf keine Duplikate enthalten. So:quelle
Hier ist eine einfache und unkomplizierte rekursive Implementierung.
quelle
stringPermutations
in einer Liste zu speichern - Sie können direkt darüber iterieren, zfor perm in stringPermutations(s[:pos] + s[pos+1:]):
. Sie können diefor
Schleife auch vereinfachen , indem Sieenumerate
anstelle von verwendenrange
und diechar = s[pos]
Zuordnung entfernen :for pos, char in enumerate(s):
.quelle