假设我有一个范围(section)和一个额外的要排除的范围列表,由元组(start,end)表示:
section=(1, 100) #Range from 1 to 100
toexclude=[(10,15),(40,50),(80,83)] #3 sub-ranges
我正在寻找一种有效的算法,从这两个输入中返回一个新的范围列表,如:
[(1,9),(16,39),(51,79),(84,100)]
这是引出第二个范围列表的主范围。
谢啦!
编辑:
实际上,deceze关于使用intervaltree的建议似乎很有趣。有几行:
from intervaltree import Interval, IntervalTree
t=IntervalTree()
t[1:100]="main"
t.chop(10,15)
t.chop(40,50)
t.chop(80,83)
t
IntervalTree([Interval(1, 10, 'main'), Interval(15, 40, 'main'), Interval(50, 80, 'main'), Interval(83, 100, 'main')])
显然,间隔被视为已关闭,但这是一个小问题。
section=(1, 100) #Range from 1 to 100
toexclude=[(10,15),(40,50),(80,83)] #3 sub-rang
list1 = []
list2 = [section[0]]
[list1.append(x[0]-1) for x in toexclude]
[list2.append(x[1]+1) for x in toexclude]
list1.append(section[1])
print list(zip(list2, list1)
# [(1, 9), (16, 39), (51, 79), (84, 100)]
有人这样想吗?
start, end = section
this_start = start
result = []
for exc_start, exc_end in toexclude:
this_end = exc_start - 1
result.append((this_start, this_end))
this_start = exc_end + 1
result.append((this_start, end))
编辑:添加了根据Paco H.注释进行更正的if条款
start, end = section
this_start = start
result = []
for exc_start, exc_end in toexclude:
if this_end == start:
start = exc_end + 1
else:
this_end = exc_start - 1
result.append((this_start, this_end))
this_start = exc_end + 1
if this_end <= end:
result.append((this_start, end))
section=(1, 100) #Range from 1 to 100
toexclude=[(10,15),(40,50),(80,83)] #3 sub-ranges
rangelists = [x for excRange in toexclude for x in range(excRange[0], excRange[1] + 1)]
first, last = section[0], section[0]
out_ranges = []
for x in range(section[0],section[1] + 1):
if x not in rangelists:
if first == 'unset':
first = x
last = x
elif x in rangelists:
if last == x - 1:
out_ranges.append((first, last))
first = 'unset'
else:
continue
if first != 'unset':
out_ranges.append((first, last))
print out_ranges
问题内容: 我正在尝试将一个数字范围转换为另一个数字范围,并保持比率。数学不是我的强项。 我有一个图像文件,其中点值的范围可能在-16000.00到16000.00之间,尽管典型范围可能会小得多。我想做的是将这些值压缩到0-100的整数范围内,其中0是最小点的值,而100是最大点的值。即使丢失了一些精度,它们之间的所有点也应保持相对比率,我想在python中做到这一点,但即使是通用算法也足够。我更
我正在尝试编写一个素数筛生成器,我将其转换为打印列表,然后在给定范围内打印素数。我很确定我的配对数是正确的,但出于某种原因,我在素数列表中得到了一些非素数的额外值。(我马上发现了这一点,因为我在输出中的最后一个值是3599,这不是素数)。我不确定我是否有某种逻辑错误,所以任何帮助都很棒。
当执行整个Rails应用程序的搜索时,我使用自定义范围来排除我不关心的区域的结果。比如日志文件、供应商插件等。这一直运行良好,除了自从添加了RVM支持以来,我的搜索现在包括安装的每个gem中的所有文件。当我的项目代码中实际上只有几个命中时,这通常会产生大量的搜索结果。 我很难想出一个规则来排除我的 .rvm 目录中的 gem。 我已经尝试了大量的排除规则的变体,如下所示: 我怀疑问题可能与项目外部
问题内容: 我有这条路线。 这就是我将部分加载到我的。 当我单击链接时,它会在ng-view中向我显示适当的标记。但是,当我尝试将using 包含在内时,它会正确显示它,但是会创建一个不同的范围,因此我无法与其进行交互。 我该如何解决这个问题?还是有其他方法可以达到相同的结果? 问题答案: 您实际上可以在不使用共享服务的情况下执行此操作。$ scope。$ emit(…)可以将事件调度到$ roo
问题内容: 是否可以通过某种方式将一个函数的范围传递给另一个函数? 例如, 我宁愿直接访问变量,即,不使用类似或的任何东西,而只是直接使用或。 问题答案: 真正访问函数私有范围的唯一方法是在函数内部声明,这样就形成了一个闭包,允许隐式访问变量。 这是您的一些选择。 直接访问 在内部声明。 如果您不想在中使用,则可以将它们都放在更大的容器范围内: 这些是您可以直接使用的变量而无需任何额外的代码来移动
问题内容: 我凝视着监视器已经太久了,不要问:我如何使用 Elastic Search PHP库* 执行 多个范围查询 ? * 我正在尝试根据 价格 标准(小于或大于)和类别内的 产品数量 (最少2个产品,仅2个产品,等等)查询我的索引。 虽然单独工作正常,但结合 我正在努力找到一个不错的近期示例,该示例涵盖ES v0.9之后的此场景,但在我的v1.4.2上却失败了。 问题答案: 您的回答是正确的