[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:31:30 CEST 2004


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
> 
> #!/usr/local/bin/python
> l=[3,5,6,7,8,9,10,11,12,22,23,24,25,26,32,34,36,38,39,40,41,44,45,47]
> l.sort()
> r=""
> mylist=[]
> for c in xrange(len(l)-1):
>         mylist.append(l[c])
>         if l[c]+1 == l[c+1]:continue
>         if len(mylist)==1:r=r+str(mylist[0])+ ","
>         else:r=r + str(mylist[0]) +"-" + str(mylist[len(mylist)-1])+","
>         mylist=[]
> mylist.append(l[len(l)-1])
> if len(mylist)==1:r=r+str(mylist[0])+ ","
> else:r=r + str(mylist[0]) +"-" + str(mylist[len(mylist)-1])+","
> print r
> 
> 

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


# fuer Python 2.2
from __future__ import generators


def x(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


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