python的区间算法

python-intervals的Python项目详细描述


python的区间算法

traviscoverage statuspypi

此库为Python2.7+和Python3.4+提供间隔算法。

功能

  • 支持任何(可比)对象的间隔。
  • 封闭或开放、有限或(半)无限间隔。
  • 支持原子间隔和间隔集。
  • 自动简化间隔。
  • 支持迭代、比较、转换、交集、并、补、差、容。
  • 将间隔导入并导出到字符串和python内置数据类型。

安装

您可以使用pip来安装它,就像往常一样:pip install python intervals

这将安装最新的可用版本。 可以从github上的master分支获取预发行版

为了方便起见,库包含在单个python文件中,因此可以很容易地集成到其他 不需要显式依赖项的项目(提示:不要这样做!)

文档和用法

间隔创建

假设这个库是使用iimport intervals导入的,那么可以使用 以下助手:

>>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()

使用此库创建的间隔是interval实例。 interval对象是表示单个间隔(例如[1,2])的原子间隔的析取,对应于atomicinterval实例。 除非显式创建或检索原子间隔,否则只会公开interval实例。

边界区间可以是任意值,只要它们是可比的:

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]

使用i.inf-i.inf作为上界或下界,支持无限和半无限间隔。 这两个对象支持与任何其他对象进行比较。 当无穷大用作下限或上限时,相应的边界将自动转换为开放边界。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)

空间隔始终解析为(i.inf,-i.inf),而不考虑提供的界限:

>>>I.empty()==I.open(I.inf,-I.inf)True>>>I.closed(4,3)==I.open(I.inf,-I.inf)True>>>I.openclosed('a','a')==I.open(I.inf,-I.inf)True

为了方便起见,间隔会自动简化:

>>>I.closed(0,2)|I.closed(2,4)[0,4]>>>I.closed(1,2)|I.closed(3,4)|I.closed(2,3)[1,4]>>>I.empty()|I.closed(0,1)[0,1]>>>I.closed(1,2)|I.closed(2,3)|I.closed(4,5)[1,3]|[4,5]

请注意,不支持离散间隔,例如,将[0,1][2,3]组合将不支持结果。 在[0,3]中,即使12之间没有整数

算术运算

intervalatomicinterval都支持以下间隔操作:

  • x.is_empty()测试间隔是否为空。

    >>>I.closed(0,1).is_empty()False>>>I.closed(0,0).is_empty()False>>>I.openclosed(0,0).is_empty()True>>>I.empty().is_empty()True
  • x.交集(其他)x&;其他返回两个区间的交集。

    >>>I.closed(0,2)&I.closed(1,3)[1,2]>>>I.closed(0,4)&I.open(2,3)(2,3)>>>I.closed(0,2)&I.closed(2,3)[2]>>>I.closed(0,2)&I.closed(3,4)()
  • x.union(其他)x其他返回两个间隔的并集。

    >>>I.closed(0,1)|I.closed(1,2)[0,2]>>>I.closed(0,1)|I.closed(2,3)[0,1]|[2,3]
  • x.补码(其他)~x返回间隔的补码。

    >>>~I.closed(0,1)(-inf,0)|(1,+inf)>>>~(I.open(-I.inf,0)|I.open(1,I.inf))[0,1]>>>~I.open(-I.inf,I.inf)()
  • x.差异(其他)x-其他返回x其他之间的差异

    >>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
    0
  • x.contains(other)other in x如果间隔中包含给定项,则返回true。 支持intervalatomicinterval和任意可比值。

    >>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
    1
  • x.重叠(其他)测试两个间隔之间是否有重叠。 此方法接受默认为falsepermissive参数。如果为真,则认为[1,2]和 [2,3]在2(但不是[1,2]和(2,3])上有重叠。

    >>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
    2

以下方法仅适用于间隔实例:

  • x.enclosure()返回包含当前间隔的最小间隔。

    >>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
    3
  • x.to_atomic()相当于x.enclosure()但返回一个atomicInterval而不是Interval对象。

  • x.is_atomic()如果间隔由单个(可能为空)原子间隔组成,则计算结果为true

    >>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
    4

区间的界限

可以分别访问atomicinterval的左右边界和上下界 其属性。 边界要么是i.closedtrue)要么是i.openfalse)。

>>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
5

类似地,可以使用访问间隔实例的界限, 属性。在这种情况下,指其外壳的下限, 而则指其外壳的上限:

>>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
6

可以根据间隔的界限轻松检查某些间隔属性:

>>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
7

intervalatomicinterval实例都是不可变的,但是提供了一个replace方法 可用于基于当前实例创建新实例。此方法接受四个可选 参数,和

>>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
8

可以传递函数而不是值。如果函数是pa它是用当前对应的 值,除非相应的界限是无穷大,如果设置为false

>>>I.open(1,2)(1,2)>>>I.closed(1,2)[1,2]>>>I.openclosed(1,2)(1,2]>>>I.closedopen(1,2)[1,2)>>>I.singleton(1)[1]>>>I.empty()()
9

replace应用于非原子的interval时,它被扩展和/或限制为 它的外壳满足新的界限。

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
0

区间变换

要在间隔上应用任意转换,interval实例将公开一个apply方法。 此方法接受将应用于每个底层原子间隔的函数,以执行所需的转换。 该函数应返回atomicintervalinterval或4倍的(左、下、上、右)

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
1

当与replace结合使用时,apply方法非常强大。 因为后者允许函数作为参数传递,并且可以忽略无穷大,所以可以 方便地用于在无穷远处变换间隔。

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
2

迭代索引

可以迭代间隔来访问底层的atomicinterval对象,按其上下界排序。

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
3

interval的atomicinterval对象也可以使用其索引来访问:

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
4

比较运算符

可以使用经典的=运算符检查间隔之间的相等性:

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
5

此外,使用例如>;>;=<;<;=可以比较间隔和原子间隔。 这些比较运算符的行为与通常的不同。 例如,如果a完全位于b的下界左侧,则a<;b保持,如果a完全位于a的下界左侧,则a<;b保持 在b

的上限右侧
>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
6

类似地,如果a完全位于b的上限左侧且a>;=b 如果a完全位于b的下限右侧,则保持

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
7

间隔也可以与单个值进行比较。如果i是一个间隔并且x是一个值,则 x<;i如果x位于i的下限左侧,则保持;如果x位于 i的上限的左边。这种行为类似于第一个 将x转换为单次间隔。

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
8

注意,这些语义不同于经典的比较运算符。 因此,有些区间在经典意义上是不可比的,如下所示:

>>>I.closed(1.2,2.4)[1.2,2.4]>>>I.closed('a','z')['a','z']>>>importdatetime>>>I.closed(datetime.date(2011,3,15),datetime.date(2013,10,10))[datetime.date(2011,3,15),datetime.date(2013,10,10)]
9

导入和导出间隔到字符串

可以使用repr(如上所示)或使用to\u string函数将间隔导出为字符串。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
0

此函数接受intervalatomicinterval实例。 构建字符串表示的方式可以使用 到字符串

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
1

类似地,可以使用from_string函数从字符串创建间隔。 必须提供转换函数(conv参数)才能将绑定(作为字符串)转换为值。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
2

to_string类似,可以对函数from_string进行参数化,以处理更详细的输入。 请注意,由于from_string需要正则表达式模式,因此我们需要转义一些字符。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
3

当绑定包含逗号或其表示不能用字符串中的自动解析时, 绑定参数可用于指定应用于匹配其表示形式的正则表达式。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
4

导入和导出间隔到python内置数据类型

间隔也可以通过to_data导出到一个4元组的列表,例如,支持json序列化。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
5

用于转换边界的函数可以用conv参数指定。 必须用来表示正无穷大和负无穷大的值可以用 pinfninf。它们默认分别为float('inf')float('-inf')

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
6

间隔可以通过from_data从这样一个4元组列表中导入。 同一组参数可用于指定如何转换边界和无穷大。

>>>I.inf>'a',I.inf>0,I.inf>True(True,True,True)>>>I.openclosed(-I.inf,0)(-inf,0]>>>I.closed(-I.inf,I.inf)# Automatically converted to an open interval(-inf,+inf)
7

贡献

非常欢迎您的贡献! 可以使用GitHub问题和/或请求请求报告错误或建议新功能。

许可证

分布在lgplv3-gnu Lesser General Public License,版本3

更改日志

该库遵循语义版本控制方案。

1.8.0(2018-12-15)

  • 间隔有一个属性,它们表示其外壳。
  • 间隔有一个replace方法来基于当前间隔创建新的间隔。此方法同时接受值和函数。
  • 区间有一个apply方法来在底层原子区间上应用函数。
  • 间隔也可以与单个值进行比较。
  • i.empty()返回相同的实例以节省内存。
  • 无穷大是单重物体。
  • 设置len(i.empty())=1i.empty()[0]==i.empty()。为保持一致性,请将其设置为u atomic()

1.7.0(2018-12-06)

  • 从python内置数据类型导入并导出到python(一个4元组的列表),其中包含from廑datato廑data\6)。
  • 添加任意间隔转换的示例。

1.6.0(2018-08-29)

  • 中添加对自定义无限表示的支持到字符串来自字符串\3)。

1.5.4(2018-07-29)

  • 修正。重叠\2)。

1.5.3(2018-06-21)

  • 修正原子单重态间隔的无效repr

1.5.2(2018-06-15)

  • 修正比较intervalatomicinterval时的无效比较。

1.5.1(2018-04-25)

  • 通过使空间隔始终解析为(i.inf,-i.inf),修复\1

1.5.0(2018-04-17)

  • interval.\uu init\uu除了atomicinterval实例之外,还接受interval实例。

1.4.0(2018-04-17)

  • 函数i.to_string将间隔导出为字符串,有许多选项可自定义表示。
  • 函数i.from_string从字符串创建间隔,有许多选项可自定义解析。

1.3.2(2018-04-13)

  • 支持Python 2.7。

trong>1.3.1(2018-04-12)

  • 定义插槽以降低内存使用率并加快属性访问。
  • 定义interval.\uu rand\uu(和其他魔术方法)以支持intervalatomicinterval而不是 在atomicinterval中有一段专用代码
  • 修复所有问题
  • 更多测试涵盖所有比较。

1.3.0(2018-04-04)

  • 有意义的<;=>;=间隔比较。

1.2.0(2018-04-04)

  • interval支持索引以检索底层的atomicinterval对象。

1.1.0(2018-04-04)

  • atomicintervalinterval都是完全可比的。
  • 添加singleton(x)以创建singleton间隔[x]。
  • 添加empty()以创建空间隔。
  • 添加interval.enclosure()以返回包含当前间隔的最小间隔。
  • 区间简化是o(n)而不是o(n*m)。
  • atomicinterval间隔中的对象按上下界排序。

1.0.4(2018-04-03)

  • atomicinterval的所有操作(重叠除外)都接受interval
  • 如果不支持类型(与未实现的类型一致),则提升typeerror而不是valueerror

1.0.3(2018-04-03)

  • PYPI的初始工作版本。

1.0.0(2018-04-03)

  • 初始版本。

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

推荐PyPI第三方库


热门话题
编译器构造为什么在Java中允许初始化对Null的引用?   java手动调用javax的actionPerformed。摆动计时器   使用git分支的java Maven版本控制   Java8句子流   java JPA OneToOne和OneToMany实体实例化/创建   java如何将值添加到列表<Map<String,Object>>?   java如何使用ComboBox在一个框架内更改JPanel。getSelectedIndex()   java在比较XML和xmlunit时忽略文本差异   java无法从其他pc连接到本地主机   Java中分配对象id的优雅方式   Java中静态变量的使用   java试图从Neteller获取OAuth访问令牌时产生错误:“服务器返回HTTP响应代码:401表示URL”   Java:基元类型是否会影响性能?   java可以让hasNext()不区分大小写吗?   基于AutoCompleteTextView建议属性或AutoCompleteTextView值的java Android搜索   java流文件到firefox浏览器有时无法打开应用程序对话框   在没有ArrayList的Java中返回数组中的搜索结果   复制java。木卫一。IOException:数据错误(CRC)   java为什么我在尝试删除Facebook测试用户时会出现“方法未实现”错误   java如何使用JNA调用SetProcessReliationPolicy