[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
- Vorherige Nachricht: [Python-de] 1,2,3,5,7,8,9 -> "1-3,5,7-9"
- Nächste Nachricht: [Python-de] 1,2,3,5,7,8,9 -> "1-3,5,7-9"
- Nachrichten sortiert nach:
[ Datum ]
[ Thema ]
[ Betreff (Subject) ]
[ Autor ]
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]
)
),"")
- Vorherige Nachricht: [Python-de] 1,2,3,5,7,8,9 -> "1-3,5,7-9"
- Nächste Nachricht: [Python-de] 1,2,3,5,7,8,9 -> "1-3,5,7-9"
- Nachrichten sortiert nach:
[ Datum ]
[ Thema ]
[ Betreff (Subject)]
[ Autor ]