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

René Liebscher R.Liebscher at gmx.de
Fre Jun 18 10:54:39 CEST 2004


René Liebscher schrieb:
> Frank Immich schrieb:
> 
>> Hallo zusammen,
>> 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...
>>
>> Vielen Dank Grüße Frank
>>
>> ...
> 
> Denksportaufgaben sind immer eine Herausforderung ;-)
> 
> Ob das folgende einfacher ist, weiss ich auch nicht. Aber ich finde es 
> übersichtlicher. (Ausserdem wollte ich schon immer mal Generatoren 
> ausprobieren. Und das scheint mir ein guten Anwendungsfall zu sein. Mit 
> filter,reduce und co. kommt man nicht so richtig weiter, weil man sich 
> den letzten Zustand/Ausgabe irgendwie merken muss.)
> 
> MfG
> Rene
> 
Da muss ich mich selber korrigieren, man kann ja in reduce auch die 
bereits gebaute Liste als Zustandsspeicher missbrauchen.
Das sieht dann so aus. (Ist sogar noch kuerzer als die andere Variante. 
Wie das von der Laufzeit bei sehr grossen Eingabelisten aussieht, ist 
eine andere Sache, weil je für jedes Element eine neue Liste angelegt wird.)

def y(list,element):
     if len(list) == 0:
         return [element]
     # Nachfolger von letzem in der liste
     if list[-1] == element-1:
         # liste erst angefangen oder irgendwas wie '... , x' drin
         if len(list)<2 or list[-2]==',':
             # anhaengen
             return list+['-',element]
         else:
             # letztes Element in Liste austauschen
             return list[:-1]+[element]
     else:
         # neues anhaengen
         return list+[',',element]

print string.join(
     # die Zahlen muessen noch Strings werden
     map(str, 
reduce(y,[3,5,6,7,8,9,10,11,12,22,23,24,25,26,32,34,36,38,39,40,41,44,45,47],[])
         ),"")