converting a list of integers into range in python

后端 未结 11 1417
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-28 07:35

Is there something existing in python that can convert an increasing list of integers into a range list

E.g. given the set {0, 1, 2, 3, 4, 7, 8, 9, 11} I want to get

11条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-28 07:54

    Generating range pairs:

    def ranges(lst):
        s = e = None
        r = []
        for i in sorted(lst):
            if s is None:
                s = e = i
            elif i == e or i == e + 1:
                e = i
            else:
                r.append((s, e))
                s = e = i
        if s is not None:
            r.append((s, e))
        return r
    

    Example:

    >>> lst = [1, 5, 6, 7, 12, 15, 16, 17, 18, 30]
    >>> print repr(ranges(lst))
    [(1, 1), (5, 7), (12, 12), (15, 18), (30, 30)]
    

    As a generator:

    def gen_ranges(lst):
        s = e = None
        for i in sorted(lst):
            if s is None:
                s = e = i
            elif i == e or i == e + 1:
                e = i
            else:
                yield (s, e)
                s = e = i
        if s is not None:
            yield (s, e)
    

    Example:

    >>> lst = [1, 5, 6, 7, 12, 15, 16, 17, 18, 30]
    >>> print repr(','.join(['%d' % s if s == e else '%d-%d' % (s, e) for (s, e) in gen_ranges(lst)]))
    '1,5-7,12,15-18,30'
    

提交回复
热议问题