[2,3,4,7] --> "2-4,7" ?

Scott David Daniels scott.daniels at acm.org
Fri May 30 15:55:47 EDT 2003


Here's a whack at doing it on-the-fly.  The tasks are split
as in Raymond Hettinger's solution.  Generators allow a nice
local look at several elements in an incoming stream.


from __future__ import generators
import re


def inputparse(source):
     splitter = re.compile('(\D*)(\d*)').match
     for name in source:
         yield splitter(name).groups()

def grouping(pairsource):
     source = iter(pairsource)
     lastname, lastnumber = source.next()
     startnumber = lastnumber
     for name, number in source:
         if name == lastname and int(number) == int(lastnumber)+1:
             lastnumber = number
         else:
             yield lastname, startnumber, lastnumber
             lastname, startnumber, lastnumber = name, number, number
     yield lastname, startnumber, lastnumber

def format(lastname, startnumber, lastnumber):
     if startnumber is lastnumber:
         return lastname + startnumber
     else:
         return lastname + startnumber + '-' + lastnumber


if __name__ == '__main__':
     names = ['6','7','mx8','mx09','mx10','8','9','10','foo']

     print ', '.join([format(name, start, stop) for name, start, stop
                      in grouping(inputparse(names))])


-Scott David Daniels
Scott.Daniels at Acm.Org





More information about the Python-list mailing list