[Python-de] 1,2,3,5,7,8,9 -> "1-3,5,7-9"

René Liebscher R.Liebscher at gmx.de
Mon Jun 21 15:13:59 CEST 2004


Alexander 'boesi' Bösecke wrote:
> Hi
> 
> Am 21.06.2004 12:26:21 schrieb Hartmut Goebel:
> 
> 
>>Und wieder zwei Bytecode-Instruktionen gespart :-)
> 
> 
> Und es geht noch schneller :)
> Wenn man statt str(element) `element` verwendet.

Stimmt, und deshalb habe ich meine Variante mit dem Generator auch noch 
mal angepasst.
Das läuft dann mehr als doppelt so schnell, wenn man die map/str 
Kombination weglässt und die Konversion in Strings schon in der Funktion 
ausführt.

Anzahl 300000
Laufzeit (Rene,y2): 3.0700 sec      # mit reduce
Laufzeit (Rene,x): 2.6200 sec       # mit Generator und map/str
Laufzeit (Rene,x2): 1.1600 sec      # mit Generator und ``

Damit dürfte ich wieder an Peter's Zeiten dran sein ;-)

MfG
Rene

##################################
def x2(data):
     minus=0
     last=data[0]
     # erstes ausgeben
     yield `data[0]`
     for i in data[1:]:
         # wenn das ein Nachfolger ist
         if i-1 == last:
             # minus ist schon mal ausgegeben?
             if minus:
                 pass
             else:
                 # dann eben jetzt erstmal
                 yield '-'
                 minus=1
             last = i
         else:
             # kein Nachfolger
             # also x-y abschliessen, y ausgeben
             if minus:
                 yield `last`
             minus =0
             # trennkomma ausgeben
             yield ','
             # Neues Element ausgeben
             yield `i`
             last = i
     # da fehlt der abschluss noch
     if minus:
         yield `last`


r = string.join(x2(l),"")

###################################