基本区间算法、区间序列与区间映射
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上的文档。
历史记录
Version | Changes |
---|---|
0.8.1 | Additional tests (enhanced coverage). |
0.8.0 | First public release. |