如何在 python 中加入整数区间?

How to join integers intervals in python?

我已经使用了模块间隔(http://pyinterval.readthedocs.io/en/latest/index.html)

并从集合或开始、结束元组创建间隔:

intervals = interval.interval([1,8], [7,10], [15,20])

由于 [1,8] 和 [7,10] 重叠,导致区间 ([1.0, 10.0], [15.0, 20.0])。

但是这个模块将对的值解释为实数,所以两个连续的整数区间不会被连接在一起。

示例:

intervals = interval.interval([1,8], [9,10], [11,20]) 

结果为:区间([1.0, 8.0], [9.0, 10.0], [11.0, 20.0])

我的问题是如何将这个间隔作为整数而不是实数加入?在最后一个示例中,结果将是 interval([1.0, 20.0])

我想出了以下程序:

ls = [[1,8], [7,10], [15,20]]
ls2 = []
prevList = ls[0]
for lists in ls[1:]:
    if lists[0] <= prevList[1]+1:
        prevList = [prevList[0], lists[1]]
    else:
        ls2.append(prevList)
        prevList = lists
ls2.append(prevList)

print ls2 # prints [[1, 10], [15, 20]]

它遍历所有列表并检查每个列表的第一个元素是否小于或等于前一个元素 + 1。如果是,它会将两个合并。

间隔模块 pyinterval 用于实数,而不是整数。如果你想使用对象,你可以创建一个整数区间 class 或者你也可以编写一个程序来使用区间模块连接整数区间:

def join_int_intervlas(int1, int2):
    if int(int1[-1][-1])+1 >= int(int2[-1][0]):
        return interval.interval([int1[-1][0], int2[-1][-1]])
    else:
        return interval.interval()

我相信您也可以通过添加 interval([-0.5, 0.5]) 将 pyintervals 用于整数间隔。用你的例子你得到

In[40]:  interval([1,8], [9,10], [11,20]) + interval([-0.5, 0.5])
Out[40]: interval([0.5, 20.5])

这需要一个元组列表,例如 l = [(25,24), (17,18), (5,9), (24,16), (10,13), (15,19), (22,25)]

# Idea by Ben Voigt in 
def sort_condense(ivs):
    if len(ivs) == 0:
        return []
    if len(ivs) == 1:
        if ivs[0][0] > ivs[0][1]:
            return [(ivs[0][1], ivs[0][0])]
        else:
            return ivs
    eps = []
    for iv in ivs:
        ivl = min(iv)
        ivr = max(iv)
        eps.append((ivl, False))
        eps.append((ivr, True))
    eps.sort()
    ret = []
    level = 0
    i = 0
    while i < len(eps)-1:
        if not eps[i][1]:
            level = level+1
            if level == 1:
                left = eps[i][0]
        else:
            if level == 1:
                if not eps[i+1][1]
                   and eps[i+1][0] == eps[i][0]+1:
                    i = i+2
                    continue
                right = eps[i][0]
                ret.append((left, right))
            level = level-1
        i = i+1
    ret.append((left, eps[len(eps)-1][0]))
    return ret

In [1]: sort_condense(l)
Out[1]: [(5, 13), (15, 25)]

Ben Voigt 对

的回答中概述了这个想法

Python 不是我的主要语言,抱歉。