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