我想使用 Python 表示一组整数范围,其中可以动态修改该集合并测试包含情况。具体来说,我想将其应用于文件中的地址范围或行号。
我可以定义我关心的地址范围:
200 - 400
450 - 470
700 - 900
然后我希望能够向集合添加一个可能重叠的范围,这样当我添加
460 - 490
时,集合就变成:
200 - 400
450 - 490
700 - 900
但是然后能够从集合中删除,我可以排除范围
300 - 350
并且集合变成:
200 - 300
350 - 400
450 - 490
700 - 900
最后,我希望能够迭代集合中包含的所有整数,或者测试集合是否包含特定值。
我想知道执行此操作的最佳方法是什么(特别是如果 Python 中内置了某些东西)。
您正在描述一个区间树。
pip install intervaltree
用途:
from intervaltree import IntervalTree, Interval
tree = IntervalTree()
tree[200:400] = True # or you can use ranges as the "values"
tree[450:470] = True
tree[700:900] = True
查询:
>>> tree
IntervalTree([Interval(200, 400, True), Interval(450, 470, True), Interval(700, 900, True)])
>>> tree[250]
{Interval(200, 400, True)}
>>> tree[150]
set()
添加重叠范围:
>>> tree[450:490] = True
>>> tree
IntervalTree([Interval(200, 400, True), Interval(450, 470, True), Interval(450, 490, True), Interval(700, 900, True)])
>>> tree.merge_overlaps()
>>> tree
IntervalTree([Interval(200, 400, True), Interval(450, 490), Interval(700, 900, True)])
丢弃:
>>> tree.chop(300, 350)
>>> tree
IntervalTree([Interval(200, 300, True), Interval(350, 400, True), Interval(450, 490), Interval(700, 900, True)])
我用不同的语言实现了类似的东西。
基本思路:
bisect
在日志时间内搜索它。这为您提供了查找/包含测试。这应该可以帮助您开始。
使用 python 内置函数,您可以使用以下内容:
range_1 = range(450, 470)
range_temp = range(460, 490)
if any(num in range_1 for num in range_temp):
start = min(range_1.start, range_temp.start)
stop = max(range_1.stop, range_temp.stop)
range_1 = range(start, stop)
当然需要进一步的逻辑来检查多个范围间隔的重叠。