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

Thorsten Kampe thorsten at thorstenkampe.de
Fre Jun 18 19:10:00 CEST 2004


* Frank Immich (2004-06-18 09:24 +0100)
> ich bin irgendwie nicht zufrieden... 
> Ich würde gerne aus einer Liste:
> z.b.
> 1,2,3,5,7,8,9,11
> einen String generieren, wobei fortlaufende Reihen zusammengefasst werden.
> ->  "1-3,5,7-9,11"
> 
> hier mein kläglicher Vesuch...
> irgendwie habe ich das Gefühl: Das muss einfacher gehen ?
> Vielleicht hat ja jemand Lust auf diese kleine morgendliche
> Denksportaufgabe...

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:

numbers = [3, 5, 6, 7, 8, 9, 10, 11, 12, 22, 23, 24, 25, 26, 32, 34, 36, 38, 39, 40, 41, 44, 45, 47]

import itertools
intervals = []
result =    []

while numbers:
    rangelist = list(itertools.takewhile(lambda x: x[0] == x[1],
                                         zip(numbers, range(numbers[0], numbers[0] + len(numbers)))))
    intervals.append((rangelist[0][0], rangelist[-1][0]))
    del numbers[:len(rangelist)]
    
for interval in intervals:
    if interval[0] == interval[1]:
        result.append(str(interval[0]))
    else:
        result.append(''.join([str(interval[0]), '-', str(interval[1])]))
print ', '.join(result)


Wie schneidet mein Programm in der Laufzeit ab?

Thorsten