示例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用法介绍 :