相交范围列表

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]

使用

有三种基本类型:PointRangeItem和{}。在

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表示单个范围:

^{pr2}$

范围项支持基本的数学运算,如包含、相等和交集检查。也可以测试某个点是否包含在给定范围内:

>>>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对象的交集,遵循它们的边界:

  1. 添加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. 添加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]']
  3. 更复杂的例子是,当我们将两个范围与排除的边界重叠时:

    >>>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

实际应用

考虑两个例子:

  1. 数值刻度上的距离交集。假设我们要编程方程组:

    • 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
  2. 时间刻度。假设我们正在构建一个向客户发送通知的系统,每个客户都有自己的规则,何时发送或不发送通知。假设一个客户希望从上午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

安装

最好的安装方法是使用pippip install rangelist

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java需要设置框架。可设置大小(false)以重新绘制()   java我对PDF文件感到困惑   为什么是太阳。jvm。热点。调试器。DebuggerException:无法打开二进制文件`?   设置结果为textview时出现java空指针异常   我应该使用什么同步原语在Java中实现事件驱动程序框架?   java为什么WindowClosing处理程序在退出程序之前不执行后台任务?   如何将“20170712T18:43:04.000Z”转换为安卓或java中的相对时间?   Java,获取按键的时间长度,currentTimeMillies()始终为24   maven构建的java可执行Jar找不到logback。xml   java在其外部的函数中使用for循环中的值   java如何以表格格式将不同长度的数据对齐   java Play 2.5 WebSocket连接构建   maven而非eclipse的java强制转换问题   java如何在JFreeChart中使X轴上的值水平?   构建Java Windows应用程序以访问在线MySQL数据库需要什么   java添加构造函数会出错吗?这没有道理,请帮忙,编程问题   java在一个jframe中的两个JPanel中使用两个绘制方法   java数学或逻辑问题   java如何复制Androids库存摄像头方向更改