Was ist der schnellste Weg, um eine Zahl mit eindeutigen Ziffern in Python zu bekommen?

8

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%     
SetSlapShot 11.09.2013, 03:42
quelle

4 Antworten

15

Verwenden Sie itertools.permutations :

%Vor%

Ich habe die Tatsache benutzt, dass:

  • Zahlen zwischen 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,
  • Sie können Permutationen direkt auf der ganzen Zahlenfolge ausführen (also keinen Overhead für die Konvertierung der Typen),

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:

  • Lösungs-Nr. 1 nahm 7.96 s ,
  • Lösungs-Nr. 2 (meine ursprüngliche Lösung) nahm 1.88 s ,
  • Lösungs-Nr. 3 nahm 8.6 s ,
  • Lösungs-Nr. 4 (meine aktualisierte Lösung) nahm 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.

    
Tadeck 11.09.2013, 03:53
quelle
7

Billiger Weg, dies zu tun:

%Vor%

Dies verwendet set , um die eindeutigen Ziffern zu erfassen, und prüft dann, ob es insgesamt so viele eindeutige Ziffern wie Ziffern gibt.

    
nneonneo 11.09.2013 03:44
quelle
4

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%     
user764357 11.09.2013 03:57
quelle
1

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

  • 2.75808000565 (Meine Lösung)
  • 8.22729802132 (Sol 1)
  • 1.97218298912 (Sol 2)
  • 9.659760952 (Sol 3)
  • 0.841020822525 (Sol 4)
erjoalgo 11.09.2013 15:29
quelle

Tags und Links