我想使用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)])
问题内容: 在Python中,有没有一种方法可以获取可以使用的最大整数?是否有一些像INT_MAX这样的预定义常量? 问题答案: Python具有任意精度的整数,因此没有真正的固定最大值。您仅受可用内存的限制。 在Python 2中,有两种类型,int和long。ints使用C类型,而longs是任意精度。您可以使用查找最大值int。但是int会自动将提升为long,因此您通常不必担心: 工作正常
问题内容: 我目前使用和循环的实现遇到性能问题。我正在考虑进行一些自定义,但是否可以正确覆盖getter以便与以下设置一起使用: Map包含自定义对象,键可以如下: 在这种情况下使用地图是最好的方法,有什么替代方法? 谢谢。 问题答案: 更新: 添加了完整的实现 更新2: 如果需要,可以按照注释中的建议将RangeMap用于内部。 如果键范围不重叠,则可以创建一个自定义容器,该容器内部使用以下实现
问题内容: 我有一个元组列表,每个元组都是一个。我正在尝试合并所有重叠的时间范围,并返回不同时间范围的列表。例如 这是我的实现方法。 我想弄清楚是否 是某些python模块中的内置函数可以更有效地做到这一点吗?要么 有没有达到相同目标的更Python方式? 感谢您的帮助。谢谢! 问题答案: 使用Pythonic可以提高效率的几种方法: 消除了构造,因为该算法应在主循环中删除重复项。 如果只需要遍历
问题内容: 我已经看到了许多解决方案来识别日期范围重叠的记录,还有其他一些合并重叠范围的示例。 但是,我对显示仅重叠发生范围的结果感兴趣。实际上,我有3个ProductID(并且只有3个将存在),并且我试图为每个客户查找所有3个日期的日期范围。 问题答案: 答案如下: 这是使用自连接来计算每个产品上不同产品的数量。您需要三种截然不同的产品,因此该子句正在执行此操作。 有三种截然不同的产品,直到其中
我来自生物学,对python和ML非常陌生,实验室有一个blackbox ML模型,输出如下序列: 每个值表示持续时间为0.25秒的预测时间帧。 1表示高。 0表示不高。 如何将这些预测转换为[开始、停止、标签] 以便将更长的序列分组,例如,前10个序列表示0到10*。因此,第一个范围和标签为 [[0.0,2.5, High] 接下来有13个零=== 因此,最终列表类似于列表/范围的列表,具有唯一
问题内容: 我试图找到一种基于特定列(id)在数据框中查找重叠数据范围(每行提供的开始/结束日期)的更有效方法。 数据框在“来自”列上排序 我认为有一种方法可以像我一样避免“双重”应用功能… 我使用“应用”功能在所有组上循环,并且在每个组中,每行使用“应用”: 问题答案: 您可以移动列并直接减去日期时间。 分组时应用它可能看起来像 演示版