簡體   English   中英

如何在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])

我的問題是如何將這個區間作為整數而不是實數加入? 在最后一個例子中,結果將是間隔([1.0,20.0])

interval模塊pyinterval用於實數,而不是整數。 如果要使用對象,可以創建整數間隔類,也可以使用interval模塊對程序進行編碼以連接整數間隔:

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()

我想出了以下程序:

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.如果是,則它將兩個元素組合在一起。

我相信你也可以通過添加interval([-0.5, 0.5]) 0.5,0.5 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 https://stackoverflow.com/questions/32869247/a-container-for-integer-intervals-such-as-rangeset-for-c
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 對C ++的整數區間容器(如RangeSet)的回答概述了這個想法

對不起,Python不是我的主要語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM