Lemme klären:
Was wäre der schnellste Weg, um jede Nummer mit allen eindeutigen Ziffern zwischen zwei Zahlen zu bekommen. Zum Beispiel 10.000 und 100.000.
Einige offensichtliche wären 12.345 oder 23.456. Ich versuche einen Weg zu finden, sie alle zu sammeln.
%Vor% Verwenden Sie itertools.permutations
:
Ich habe die Tatsache benutzt, dass:
10000
und 100000
haben entweder 5 oder 6 Ziffern, aber nur 6-stellige Zahlen haben hier keine eindeutigen Ziffern, itertools.permutations
erstellt alle Kombinationen mit allen Ordnungen (also werden sowohl 12345
als auch 54321
im Ergebnis angezeigt), mit gegebener Länge, BEARBEITEN :
Danke, dass Sie meine Antwort akzeptiert haben, aber hier sind die Daten für die anderen, die erwähnten Ergebnisse werden verglichen:
%Vor%Also, um es zusammenzufassen:
7.96 s
, 1.88 s
, 8.6 s
, 0.75 s
, Die letzte Lösung sieht etwa 10x schneller aus als die von anderen vorgeschlagenen Lösungen.
Hinweis: Meine Lösung enthält einige Importe, die ich nicht gemessen habe. Ich nahm an, dass Ihre Importe einmal passieren werden, und Code wird mehrfach ausgeführt. Wenn dies nicht der Fall ist, passen Sie die Tests an Ihre Bedürfnisse an.
BEARBEITEN # 2 : Ich habe eine andere Lösung hinzugefügt, da das Arbeiten mit Strings nicht einmal notwendig ist - es kann durch Permutationen von echten ganzen Zahlen erreicht werden. Ich wette, das kann noch mehr beschleunigen.
Das Verständnis der Listen wird hier ein Vergnügen bereiten (Logik, die von nneonneo gestohlen wurde):
%Vor%Und eine Zeit für diejenigen, die neugierig sind:
%Vor%Hier ist eine Antwort von Grund auf:
%Vor%Es könnte vielleicht weiter optimiert werden, indem eine Intervalldarstellung der erlaubten Elemente verwendet wird, obwohl ich für n = 10 nicht sicher bin, ob es einen Unterschied machen wird. Ich könnte die Rekursion auch in eine Schleife verwandeln, aber in dieser Form ist sie eleganter und klarer.
Bearbeiten: Hier sind die Timings der verschiedenen Lösungen
Tags und Links python performance