【问题标题】:creating a set of consecutive non-overlapping bounds from a larger given bounds [closed]从较大的给定边界创建一组连续的非重叠边界[关闭]
【发布时间】:2021-09-03 13:20:47
【问题描述】:

如果一个边界被给定为 (40,260),它需要被分成 4 个相等的更小的连续非重叠边界(即,(40,95),(96,150),(151,205),(206,260)) 我尝试了以下方法。

def range_non_overlapping(range_left, range_right, range_per_cut, cut_num)  
    ranges=[]
    for i in range(cut_num):
            ranges.append(range_left + i * range_per_cut)
            ranges.append(min(range_right, (range_left + (i + 1) * range_per_cut))) 
    return ranges

但以下代码会导致边界 [40,95,95,150,150,205,205,260] 上的重叠区域(列表开头的对是较小的边界)。我需要创建 [40,95,96,150,151,205,206,260]

【问题讨论】:

  • StackOverflow 不是代码编写服务,因此您应该编辑您的 honet 尝试以 minimal reproducible example 的形式解决您的问题
  • 我很抱歉。我用更多信息修改了问题@barny
  • 不,您的代码仍然不是minimal reproducible example。尝试将问题中的代码按字面意思粘贴到文件中并运行它;它会产生您在问题中显示的输出吗?不提供minimal reproducible example 会降低您获得真正帮助的机会。阅读How to Ask
  • 它确实显示了我提到的输出,我已经得到了我正在寻找的帮助@barny

标签: python boundary


【解决方案1】:
def chunknize(start, stop, num):
    step = (stop - start) / num
    return [
        (start + i * step + (0 if i == 0 else 1),
        start + (i + 1) * step)
        for i in range(num)]
    
print(chunknize(40, 260, 4))
# [(40.0, 95.0), (96.0, 150.0), (151.0, 205.0), (206.0, 260.0)]

【讨论】:

  • 如果边界是 (1, 100, 5) 怎么办? - 得到 [(1, 20), (21, 39), (40, 58), (59, 77), (78, 96)] 或者如果仍然使用浮点 div。 / --- 那么结果:[(1.0, 20.8), (21.8, 40.6), (41.6, 60.400000000000006), (61.400000000000006, 80.2), (81.2, 100.0)]
  • @DanielHao 你得到这个结果是因为你使用的是整数除法。尝试使用浮点除法。
【解决方案2】:

如果端点是包容性的,那么你不能得到 4 个相等的区域,因为大小 (221) 不是 4 的倍数。我认为你想要 (40,94), (95,149), (150,204 ), (205,260)),你可以这样做:

def divide( left, right, cuts ):
    delta = (right-left+1) // cuts
    out = []
    for i in range(cuts):
        out.append( left )
        left += delta
        out.append( left - 1 )
    out[-1] = right
    return out

print( divide( 40, 260, 4 ) )

这些区域是 55、55、55 和 56。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2017-07-07
    • 2016-07-31
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多