Pythonic way to convert a list of integers into a string of comma-separated ranges

后端 未结 7 801
感情败类
感情败类 2020-12-01 05:06

I have a list of integers which I need to parse into a string of ranges.

For example:

 [0, 1, 2, 3] -> \"0-3\"
 [0, 1, 2, 4, 8] -> \"0-2,4,8\"
         


        
7条回答
  •  死守一世寂寞
    2020-12-01 05:31

    This is more verbose, mainly because I have used generic functions that I have and that are minor variations of itertools functions and recipes:

    from itertools import tee, izip_longest
    def pairwise_longest(iterable):
        "variation of pairwise in http://docs.python.org/library/itertools.html#recipes"
        a, b = tee(iterable)
        next(b, None)
        return izip_longest(a, b)
    
    def takeuntil(predicate, iterable):
        """returns all elements before and including the one for which the predicate is true
        variation of http://docs.python.org/library/itertools.html#itertools.takewhile"""
        for x in iterable:
            yield x
            if predicate(x):
                break
    
    def get_range(it):
        "gets a range from a pairwise iterator"
        rng = list(takeuntil(lambda (a,b): (b is None) or (b-a>1), it))
        if rng:
            b, e = rng[0][0], rng[-1][0]
            return "%d-%d" % (b,e) if b != e else "%d" % b
    
    def create_ranges(zones):
        it = pairwise_longest(zones)
        return ",".join(iter(lambda:get_range(it),None))
    
    k=[0,1,2,4,5,7,9,12,13,14,15]
    print create_ranges(k) #0-2,4-5,7,9,12-15
    

提交回复
热议问题