基本区间算术、区间序列和区间映射
项目描述
程序包ivalutils提供了用于基本区间算术的类以及用于构建相邻区间序列和用于构建区间到任意值的映射的类。
间隔通过可选地给出下限和/或上限来定义一组值的子集。
基本值集 - 以及给定的限制 - 必须有一个共同的基本类型,它定义了值的总顺序。
创建间隔
最简单的方法是不带参数调用Interval类,导致两个端点都是无限的:
>>> 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类用于创建从间隔到任意值的映射。
可以通过给出一个 IntervalChain 和一系列相关值来创建实例……:
>>> 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
IntervalMappings 上的操作
区间映射的行为类似于普通映射:
>>> 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上的文档。
历史
版本 |
变化 |
---|---|
0.8.1 |
附加测试(增强覆盖率)。 |
0.8.0 |
首次公开发布。 |