示例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集合。下面的这几个例子是源码中的。
前面的三个例子比较容易理解,最后一个例子中,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:
python强大的区间处理库interval用法介绍 :