相交范围列表
rangelist的Python项目详细描述
基础知识
范围是两点(边界)之间的连续间隔。E、 g.数字间隔、时间间隔、字母间隔等。范围示例如下:
- (1;3)–表示1到3之间的任何数字都属于这个区间,不包括1和3。在
- [1;3]–表示介于1和3之间的任何数字都属于这个区间,,包括1和3。在
- (1;3)-表示介于1和3之间的任何数字都属于这个区间,不包括1和{str 1}$包括3。在
在数字或时间尺度上,多个范围可以相交或共存。此标度上的任意点可以包含或排除在所有范围的交集之外。在
rangelist
包,从它的名称开始,表示范围列表,但不仅仅是一个普通列表,而是一个在数字或时间刻度上正确、有效的范围交集,更重要的是,它告诉您一个点或一个范围是否属于给定的范围列表。在
范围通常由(x;y)或[x;y]记录表示,字面意思是“从x到y的间隔”。在
边界点可能属于区间本身,也可能不属于区间本身;表示使用圆括号或方括号。在
一个范围可以是一个单点,例如[1;1]——这意味着只有1在它的范围内。在
连续间隔可以有一个排除点。E、 g.[1;5]+(3;3)=>;[1;3),(3;5]
使用
有三种基本类型:Point
,RangeItem
和{
Point
基本上表示一个点,可以是任意值;有两个特殊点表示无穷大和负无穷大:
>>>fromrangelist.pointimportPoint,INF,NEG_INF>>>Point(1)1>>>Point(1)==Point(3)False>>>Point(1)==Point(1)True>>>Point(3)>Point(1)True>>>INFinf>>>NEG_INF-inf>>>INF>Point(999)True
RangeItem
表示单个范围:
范围项支持基本的数学运算,如包含、相等和交集检查。也可以测试某个点是否包含在给定范围内:
>>>RangeItem(1,3)inRangeItem(0,4)True>>>RangeItem(1,3)==RangeItem(1,3)True>>>RangeItem(1,3)>RangeItem(-1,0)True>>>RangeItem(1,3).intersects_with(RangeItem(-1,0))False>>>RangeItem(1,3).intersects_with(RangeItem(-1,2))True>>>2inRangeItem(1,3)True
RangeList
表示多个RangeItem
对象的交集,遵循它们的边界:
- 在
添加2个包含的范围边界,然后添加一个覆盖两个范围的范围,因此它将创建一个单一的连续范围:
>>>r=RangeList()>>>r.insert(RangeItem(0,2))>>>r['[0, 2]']>>>r.insert(RangeItem(10,20))>>>r['[0, 2]','[10, 20]']>>>r.insert(RangeItem(1,11))>>>r['[0, 20]']
在 - 在
添加2个范围,其中一个范围已排除边界。然后添加一个重叠的范围。在这种情况下,排除的边界点必须保持排除(范围将中断):
>>>r=RangeList()>>>r.insert(RangeItem(0,4))>>>r['[0, 4]']>>>r.insert(RangeItem(5,10,left_excluded=True))>>>r['[0, 4]','(5, 10]']>>>r.insert(RangeItem(2,8))# note that this range overlaps existing, but point 5 is excluded>>>r['[0, 5)','(5, 10]']
在 - 在
更复杂的例子是,当我们将两个范围与排除的边界重叠时:
>>>r=RangeList()>>>r.insert(RangeItem(1,4,left_excluded=True,right_excluded=True))>>>r['(1, 4)']>>>r.insert(RangeItem(3,6,left_excluded=True,right_excluded=True))>>>r['(1, 3)','(3, 4)','(4, 6)']>>>2inrTrue>>>3inrFalse>>>4inrFalse>>>5inr>>>RangeItem(4.5,5.5)inrTrue>>>RangeItem(4,6)inrFalse>>>RangeItem(4,6,left_excluded=True,right_excluded=True)inrTrue
在
实际应用
考虑两个例子:
- 在
数值刻度上的距离交集。假设我们要编程方程组:
- x<;-5
- x≠2
- x>;-1
然后测试任意点是否满足这些方程。在
让我们用
rangelist
创建一个范围交集>>>fromrangelist.rangelistimportRangeList>>>fromrangelist.rangeitemimportRangeItem>>>fromrangelist.pointimportINF,NEG_INF>>>>>>range_items=[...RangeItem(NEG_INF,-5,right_excluded=True),...RangeItem(2,2,left_excluded=True,right_excluded=True),...RangeItem(-1,INF,left_excluded=True),...]>>>>>>range_list=RangeList(range_items)>>>range_list['[-inf, -5)','(-1, 2)','(2, inf]']>>>-10inrange_listTrue>>>-5inrange_list# should be False, since -5 is not includedFalse>>>-3inrange_list# should be False, it's outside of any intervalFalse>>>0inrange_list# should be TrueTrue>>>10inrange_list# should be TrueTrue
在 - 在
时间刻度。假设我们正在构建一个向客户发送通知的系统,每个客户都有自己的规则,何时发送或不发送通知。假设一个客户希望从上午8点到上午10点发送通知,从下午1点到晚上8点(不包括午餐时间2:30到下午3点)。让我们为这个例子建立一个范围列表,然后我们可以测试任意时间,看看它是否符合客户的期望:
>>>r=RangeList()>>>r.insert(RangeItem(dt.time(8,0),dt.time(10,0),right_excluded=True))>>>r.insert(RangeItem(dt.time(13,0),dt.time(14,30),right_excluded=True))>>>r.insert(RangeItem(dt.time(15,0),dt.time(20,0),right_excluded=True))>>>r['[08:00:00, 10:00:00)','[13:00:00, 14:30:00)','[15:00:00, 20:00:00)']>>>dt.time(8,0)inrTrue>>>dt.time(10,0)inrFalse>>>dt.time(14,0)inrTrue>>>dt.time(14,30)inrFalse>>>dt.time(20,30)inrFalse
在
安装
最好的安装方法是使用pip
:pip install rangelist
- 项目
标签: