基本区间算法、区间序列与区间映射

ivalutils的Python项目详细描述


软件包ivalutils为基本区间算法提供了如下类 以及相邻间隔的建筑顺序和建筑类别 区间到任意值的映射。

区间定义一组值的子集,可选地给出 和/或上限。

值的基集(因此是给定的限制)必须具有 定义值的总顺序的公共基类型。

创建间隔

最简单的方法是调用不带参数的类 两个端点都是无限的:

>>> ival = Interval()
>>> ival
Interval()
>>> str(ival)
'(-inf .. +inf)'

为了获得更有用的间隔,必须至少指定一个 终点:

>>> ival = Interval(LowerClosedLimit(0))
>>> ival
Interval(lower_limit=Limit(True, 0, True))
>>> str(ival)
'[0 .. +inf)'
>>> ival = Interval(upper_limit=UpperClosedLimit(100.))
>>> ival
Interval(upper_limit=Limit(False, 100.0, True))
>>> str(ival)
'(-inf .. 100.0]'
>>> ival = Interval(LowerClosedLimit(0), UpperOpenLimit(27))
>>> ival
Interval(lower_limit=Limit(True, 0, True), upper_limit=Limit(False, 27, False))
>>> str(ival)
'[0 .. 27)'

定义总排序的任何类型都可以用于限制:

>>> ClosedInterval('a', 'zzz')
Interval(lower_limit=Limit(True, 'a', True), upper_limit=Limit(False, 'zzz', True))

几个工厂函数可以用作快捷方式。例如:

>>> LowerClosedInterval(30)
Interval(lower_limit=Limit(True, 30, True))
>>> UpperOpenInterval(0)
Interval(upper_limit=Limit(False, 0, False))
>>> ClosedInterval(1, 3)
Interval(lower_limit=Limit(True, 1, True), upper_limit=Limit(False, 3, True))
>>> ChainableInterval(0, 5)
Interval(lower_limit=Limit(True, 0, True), upper_limit=Limit(False, 5, False))

间隔操作

可以通过属性检索间隔的限制:

>>> ival = ClosedInterval(0, 100)
>>> ival.lower_limit
Limit(True, 0, True)
>>> ival.upper_limit
Limit(False, 100, True)
>>> ival.limits
(Limit(True, 0, True), Limit(False, 100, True))

有几种方法可以用来测试间隔的细节。例如:

>>> ival.is_bounded()
True
>>> ival.is_finite()
True
>>> ival.is_left_open()
False

可以测试间隔是否包含值:

>>> 74 in ival
True
>>> -4 in ival
False

可以比较间隔:

>>> ival2 = LowerOpenInterval(100)
>>> ival3 = LowerClosedInterval(100)
>>> ival < ival2
True
>>> ival < ival3
True
>>> ival2 < ival3
False
>>> ival2 == ival3
False
>>> ival3 < ival2
True
>>> ival2.is_adjacent(ival3)
False
>>> ival3.is_adjacent(ival2)
False
>>> ival4 = UpperClosedInterval(100)
>>> ival4.is_adjacent(ival2)
True
>>> ival.is_overlapping(ival3)
True
>>> ival.is_subset(ival4)
True

创建相邻间隔的序列

intervalchain用于创建相邻间隔的序列:

>>> ic = IntervalChain(('a', 'd', 'g', 'z'))
>>> ic
IntervalChain(('a', 'd', 'g', 'z'))

默认值是创建一个区间序列,它是下限 上无穷大且包含下闭区间:

>>> str(ic)
"[['a' .. 'd'), ['d' .. 'g'), ['g' .. 'z'), ['z' .. +inf)]"

通过指定其他参数,可以确定哪些端点将是 关闭,以及是否将添加下和/或上无限端点:

>>> ic = IntervalChain(('a', 'd', 'g', 'z'), lower_closed = False, add_lower_inf=True, add_upper_inf=False)
>>> str(ic)
"[(-inf .. 'a'], ('a' .. 'd'], ('d' .. 'g'], ('g' .. 'z']]"

区间链上的运算

间隔链可以像列表一样索引和迭代…:

>>> ic[2]
Interval(lower_limit=Limit(True, 'd', False), upper_limit=Limit(False, 'g', True))
>>> [ival.upper_limit.value for ival in ic]
['a', 'd', 'g', 'z']

…可以搜索包含指定的 值:

>>> ic.map2idx('b')
1
>>> ic.map2idx('a')
0
>>> ic.map2idx('aa')
1

创建间隔映射

intervalmapping用于创建从间隔到 任意值。

实例可以通过给定间隔链和 关联值…:

>>> im1 = IntervalMapping(IntervalChain((0, 300, 500, 1000)), (0., .10, .15, .20))

…或一系列限制值和一系列相关值…:

>>> im2 = IntervalMapping((0, 300, 500, 1000), (0., .10, .15, .20))

…或一个元组序列,每个元组包含一个限制值和一个相关联的 值:

>>> im3 = IntervalMapping(((0, 0.), (300, .10), (500, .15), (1000, .20)))
>>> im1 == im2 == im3
True

对区间映射的操作

区间映射的行为类似于普通映射:

>>> list(im3.keys())
[Interval(lower_limit=Limit(True, 0, True), upper_limit=Limit(False, 300, False)),
 Interval(lower_limit=Limit(True, 300, True), upper_limit=Limit(False, 500, False)),
 Interval(lower_limit=Limit(True, 500, True), upper_limit=Limit(False, 1000, False)),
 Interval(lower_limit=Limit(True, 1000, True))]
>>> list(im3.values())
[0.0, 0.1, 0.15, 0.2]
>>> im3[Interval(lower_limit=Limit(True, 300, True), upper_limit=Limit(False, 500, False))]
0.1

此外,还可以查找与间隔相关的值 其中包含给定值:

>>> im3.map(583)
0.15

作为捷径,间隔映射可以像函数一样使用:

>>> im3(412)
0.1

间隔映射的用例例如:

  • 根据订单值确定要应用的折扣,
  • 根据客户的销售额对客户进行评级,
  • 根据居民数量对城市进行分类,
  • 将预订日期映射到会计期间,
  • 离散范围内测量值的分组。

有关更多详细信息,请参阅github或http://ivalutils.readthedocs.io上的文档。

历史记录

VersionChanges
0.8.1Additional tests (enhanced coverage).
0.8.0First public release.

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

推荐PyPI第三方库


热门话题
使用java的html并排表   如何修复Java(安卓)中的“找不到自由端口”错误   java为什么在以下代码中实现接口“onmapreadycallback”时出错?   java在Spring批处理中重置InMemory数据库   java非阻塞网络编程超时问题   安卓 Java:从UTF8字符串创建可绘制   java显示文本文件中包含的路径中的图像   gzipinputstream Java。伊奥。IOException:不是GZIP格式   java线程调度程序如何执行此代码?   java通过setFragmentResult将信息发送到另一个片段   java从任何地方进入活动   java如何使用SNMP4j开发用于搜索OID值的类   Java中的递归字符串索引超出范围错误(字符串索引超出范围异常)   缓存如何清除Java缓存中的特定文件?   java将构建任务添加到maven pom项目   java FileOutputStream非常慢   如果定义了父pom,则不会发生存储库url的java Maven属性替换