【问题标题】:Searching for bounds that contain value?搜索包含值的边界?
【发布时间】:2017-04-30 00:12:14
【问题描述】:

我有大量边界(定义最小和最大范围的 2 个数字)我需要一种有效的方法,我可以使用它来查找包含我正在搜索的值的每个边界。

# generated in some way at runtime
bounds = [[0,10], [30,35], [-1, 2], [-30, 105], [132, 200006]]

# runtime value, not a constant
value = 45


for bound in bounds:
    if value >= bound[0] and value <= bound[1]:
        # do something with value

上面这段代码显示了我需要的东西,但是效率极低,我需要运行数百万次。我尝试过使用某种 BSP,但是当边界重叠时,效果就不那么好了。

【问题讨论】:

  • stackoverflow.com/questions/38185688/… 可能是一个开始的地方。
  • 你有没有尝试过?,告诉我们你得到了什么
  • 没那么难。尝试一下,你会得到它。如果你使用range对象,你可以使用属性startstopstep
  • @arvindpdmn 创建一个以线性时间运行的程序并不困难,但我需要它比这更有效。因为我有数千到数百万个范围

标签: python search


【解决方案1】:

范围是一个生成器,没有任何东西。但是你可以使用'in'

>>> r = range(2,20)
>>> 3 in r

【讨论】:

  • “范围是一个生成器”——仅在 python 3 中
  • 虽然我有多个范围,但每个范围都比较低效,因为它们有很多。
  • 我看到你添加了示例代码。这看起来确实非常有效。现在假设您需要以某种方式保持界限,您至少也可以创建一些“一般界限”。首先你有 [0,10],这也是一个普遍的界限。您添加 [30,35],没有重叠,您有两个“一般界限”。现在您添加 [-1, 2],这与第一个重叠,因此您将 [0,10] 替换为 [-1, 10]。 [-30, 105], [132, 200006]
  • 我必须以这种评论格式进行格式化:-(我会再试一次 [0,10] 给出一个一般界限,[30,35],[-1, 2] 也与第一个,所以你用 [-1, 10] 替换那个 [-30, 105] 包含第一个和第二个,所以现在你有一个上限和下限,左 [132, 200006] 没有重叠。如果你使用上限和下限,我会这样做。否则只需创建一个列表或设置所有值 - 这完全取决于您的问题空间。
【解决方案2】:
def valFinder(seq , number):
  if number in seq:
    return True
  return False


print( valFinder( range(1,10) , 5 ) ) 
>> True
print( valFinder( range(10,15) , 5 ) ) 
>> False  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多