当前位置: 首页 > 知识库问答 >
问题:

如何在Python中从另一个范围中排除一个范围?

年烈
2023-03-14

假设我有一个范围(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')])

显然,间隔被视为已关闭,但这是一个小问题。

共有3个答案

欧阳睿范
2023-03-14
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)]
卢文博
2023-03-14

有人这样想吗?

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))
温嘉玉
2023-03-14
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上却失败了。 问题答案: 您的回答是正确的