Python 區間庫 interval和intervaltree


https://github.com/AlexandreDecan/python-intervals

https://github.com/chaimleib/intervaltree

示例1:創建區間&檢驗左右邊界值

In [22]: from interval import Interval

# 創建實例
In [23]: a = Interval(2,5)

# 左右邊界是均包含在內,為全閉區間
In [24]: 2 in a
Out[24]: True

In [25]: 5 in a
Out[25]: True

 

示例2:半閉半開區間&檢測閉區間邊界值

# b 左閉右開
In [26]: b = Interval(2, 5, lower_closed=False)

# 打印a,b
In [29]: a
Out[29]: Interval(2, 5, lower_closed=True, upper_closed=True)

In [30]: b
Out[30]: Interval(2, 5, lower_closed=False, upper_closed=True)

# 檢驗a,b是否包含左邊界值2
In [31]: 2 in a, 2 in b
Out[31]: (True, False)

# 檢驗a,b是否包含右邊界值5
In [32]: 5 in a, 5 in b
Out[32]: (True, True)

 

示例3:區間合並、判斷是否交叉、判斷是否比鄰

In [33]: c = Interval(1,3, lower_closed=False)

In [34]: d = Interval(3,5, lower_closed=False)

# 皆為左閉右開
In [35]: 1 in c, 3 in d
Out[35]: (False, False)

# 合並
In [36]: e = c.join(d)

# 合並之后檢測
In [37]: 3 in e
Out[37]: True

In [39]: c
Out[39]: Interval(1, 3, lower_closed=False, upper_closed=True)

In [40]: d
Out[40]: Interval(3, 5, lower_closed=False, upper_closed=True)

# 判斷是否交叉,c、d無交集
In [43]: c.overlaps(d)
Out[43]: False

# c、e有交集
In [44]: c.overlaps(e)
Out[44]: True

# e、c 反向測試
In [45]: e.overlaps(c)
Out[45]: True

# 比鄰測試
In [52]: f = Interval(0, 1, upper_closed=False)

In [53]: g = Interval(1, 3, lower_closed=False)

In [54]: h = Interval(1, 3)

# 打印f、g
In [55]: f
Out[55]: Interval(0, 1, lower_closed=True, upper_closed=False)

In [56]: g
Out[56]: Interval(1, 3, lower_closed=False, upper_closed=True)

In [57]: h
Out[57]: Interval(1, 3, lower_closed=True, upper_closed=True)

# f、g不比鄰
In [58]: f.adjacent_to(g)
Out[58]: False

In [59]: g.adjacent_to(f)
Out[59]: False

# f、h比鄰
In [60]: f.adjacent_to(h)
Out[60]: True

# 測試具有交集的區間
In [61]: i = Interval(0,2)

# 結果不比鄰
In [62]: h.adjacent_to(i)
Out[62]: False

# 測試邊界相交
In [63]: j = Interval(2, 3)

# 結果不比鄰
In [64]: i.adjacent_to(j)
Out[64]: False

# 從以上結果可以推斷,比鄰是指:1、兩個區間相鄰的邊界值相等 2、同時這兩個邊界一個為開區間,一個為閉區間,即兩個區間沒有交集

 

注:區間解釋

    數學區間是指某一范圍。分類有全開區間、全閉區間、半開半閉區間、半閉半開區間。
    全開區間:表示符號為( ),指不包括端點的區間,例如(2,4),表示實數范圍內大於2小於4范圍內的實數;
    全閉區間:表示符號為[ ],指包括端點的區間,例如[2,4],表示實數范圍內大於等於2小於等於4范圍內的實數;
    半開半閉區間:表示符號為( ],指不包括最小數據的端點,而包括最大數據的端點的區間,例如(2,4],表示實數范圍內大於2小於等於4范圍內的實數;
    半閉半開區間:表示符號為[ ),指包括最小數據的端點,而不包括最大數據的端點的區間,例如[2,4),表示實數范圍內大於等於2小於4范圍內的實數.

[a,b]     a<=x<=b     取值包括a、b
(a,b)    a<x<b         取值不包括a、b
[a,b)    a<=x<b        取值包括a,不包括b
(a,b]    a<x<=b         取值不包括a,包括b

用法舉例

不論是在Linux系統還是Windows系統上,我們都可以方便的安裝pip或者easy_install庫來方便的安裝大多數python庫,interval也不例外。
在這個庫中提供了兩個主要的類,分別是Interval和IntervalSet兩個類。
Interval類描述了一個連續的范圍區間,這個區間可以是閉、開、半閉半開、無窮的,他的區間值不一定是數字,可以包含任何的數據類型,比如字符串,時間等等,同時他和python的各種操作(<, <=, ==, >=, >等)也是兼容的。IntervalSet包含了一個或多個互不相交的Interval集合。下面的這幾個例子是源碼中的。

>>> volume1 = Interval.between("A", "Foe")
>>> volume2 = Interval.between("Fog", "McAfee")
>>> volume3 = Interval.between("McDonalds", "Space")
>>> volume4 = Interval.between("Spade", "Zygote")
>>> encyclopedia = IntervalSet([volume1, volume2, volume3, volume4])
>>> mySet = IntervalSet([volume1, volume3, volume4])
>>> "Meteor" in encyclopedia
True
>>> "Goose" in encyclopedia
True
>>> "Goose" in mySet
False
>>> volume2 in (encyclopedia ^ mySet)
True 

前面的三個例子比較容易理解,最后一個例子中,encyclopedia的區別就是mySet多了一個volume2,而異或就是將兩個集合中相同的元素去掉,不同的元素保留,所以最后只剩下了volume2。
除了字符串,利用interval還可以很方便的處理時間,下面的例子同樣來自於源碼。

>>> officeHours = IntervalSet.between("08:00", "17:00")
>>> myLunch = IntervalSet.between("11:30", "12:30")
>>> myHours = IntervalSet.between("08:30", "19:30") - myLunch
>>> myHours.issubset(officeHours)
False
>>> "12:00" in myHours
False
>>> "15:30" in myHours
True
>>> inOffice = officeHours & myHours
>>> print inOffice
['08:30'..'11:30'),('12:30'..'17:00']
>>> overtime = myHours - officeHours
>>> print overtime
('17:00'..'19:30']

在前言中說道interval庫可以處理IP地址,簡單的列舉應用如下:

# coding
r1 = IntervalSet([Interval(1, 1000), Interval(1100, 1200)])
r2 = IntervalSet([Interval(30, 50), Interval(60, 200), Interval(1150, 1300)])

r3 = IntervalSet([Interval(1000, 3000)])
r4 = IntervalSet([Interval(1000, 3000)])
r5 = IntervalSet([Interval(30000, 12000)])

print (r3 - r4), (r4 - r3), r3 & r4
print len(IntervalSet.empty())

if r3 & r4 == r4:
    print 'yes'

print r3 & r4
if (r3 - r4).empty():
   print "true"
print (r3 - r4).empty()

# output
<Empty> <Empty> [1000..3000]
0
yes
[1000..3000]
<Empty>

常用方法

  • interval對象初始化參數(lower_bound=-Inf, upper_bound=Inf, **kwargs)三個boolean參數closed,lower_closed,upper_closed分表表示全閉,左閉右開,左開右閉。比如:r = Interval(upper_bound=62, closed=False)
  • between(a, b, closed=True):返回以a和b為界的區間
  • less_than(a):小於a的所有值構成interval,類似的還有less_than_or_equal_to,greater_than,greater_than_or_equal_to函數
  • join(other):將兩個連續的intervals組合起來
  • overlaps(other):兩個區間是否有重疊
  • adjacent_to(other):兩個區間是否不重疊的毗鄰

參考地址

Python 區間庫 interval:https://blog.csdn.net/huiyanshizhu/article/details/97932768

python強大的區間處理庫interval用法介紹 :https://www.cnblogs.com/cotyb/p/5256303.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM