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

Jochen Wersdörfer jochen-python at wersdoerfer.de
Fre Jun 18 20:21:22 CEST 2004


Am Freitag, 18. Juni 2004 19:10 schrieb Thorsten Kampe:
> Das was mir an deiner Lösung und der der anderen nicht gefällt ist,
> das alles in eins geschmissen wird: die Generierung der
> "Intervallenden" und die Ausgabe. So würde ich es machen: 
> [...]
> 
> Wie schneidet mein Programm in der Laufzeit ab?

Anzahl 40000
Laufzeit (jochen): 0.5900 sec
Laufzeit (jan): 0.2200 sec
Laufzeit (bösi): 0.1400 sec
Laufzeit (gregor): 8.7500 sec
Laufzeit (thorsten): 483.7400 sec

starttime = time.clock()
from copy import copy

def z(x, y):
    if (y - 1 == x[-1]): x.append(y)
    else: x.append("x");x.append(y)
    return x

ml = copy(l)
ml[0] = [ml[0]]

# Markieren
e = reduce(z, ml)

#Auseinanderschneiden
m, n = [], []
for i in e:
    if i == "x": m.append(("%s-%s" % (n[0], n[-1]), "%s" % n[0])[n[0] == n[-1]]);n = []
    elif e[-1] == i: n.append(i);m.append(("%s-%s" % (n[0], n[-1]), "%s" % n[0])[n[0] == n[-1]])
    else: n.append(i)

#Zusammenjoinen
r = ', '.join(m)

#print r
print "Laufzeit (jochen): %3.4f sec" % (time.clock() - starttime)

Der reduce-Teil gefällt mir ganz gut, der ist auch schön schnell.
Das Auseinanderschneiden ist sehr langsam, das geht bestimmt
irgendwie besser.

Gruss,
Jochen