python - 如何检查范围是否部分在另一个范围内?

时间:2021-01-15 17:32:05

标签: python sorting

不是最好的措辞,但我会尽力解释。

我有 4 个区域,0 <= x < 1010 <= x < 3030 <= x < 5050 <= x < 90

我正在编写一个函数,它接受 x_minx_max,并输出所覆盖的区域。我无法以“好”方式解决的边缘情况之一是,如果范围跨越多个区域,例如x_min = 15, x_max = 60,输出将是:

output = {'region1' : False,
          'region2' : True,
          'region3' : True,
          'region4' : True}

我的方法如下,我现在能想到的最佳解决方案是将 x_minx_max 之间的间隔拆分为 10,并检查每个数字,但这又增加了 10 个循环(因此,对于 x_min = 15x_max = 60 示例,它将涉及检查 15、19.5、24 等直到 60)。

有没有更好、更具可扩展性的方法来做到这一点?除了 if - elif 循环中无数的 for 语句之外,我不确定还有哪些工具可用。

def assign_regions(x_min, x_max):
    values = [x_min, x_max]
    output = {'region1' : False, # a dictionary to store the output
              'region2' : False,
              'region3' : False,
              'region4' : False}

    for x in values:
        if 0 <= x < 10:
            output['region1'] = True
        elif 10 <= x < 30:
            output['region2'] = True
        elif ........

3 个答案:

答案 0 :(得分:1)

要测试两个范围是否重叠,您只需检查每个范围的起点是否小于另一个范围的终点。

regions = { 'region1' : (0,10),
            'region2' : (10,30),
            'region3' : (30,50),
            'region4' : (50,90)}

x_min,x_max = 15,60

overlaps = { reg:x_min < r_max and r_min < x_max
             for reg,(r_min,r_max) in regions.items() }

print(overlaps)
# {'region1': False, 'region2': True, 'region3': True, 'region4': True}

答案 1 :(得分:0)

您可以存储每个区域的范围,然后循环检查它们:

values = [x_min, x_max]
region_info = {
    'region1': range(0, 10),
    'region2': range(10, 30),
    # and so on
}
output = {region: False for region in region_info}

for x in values:
    for region_name, its_range in region_info.items():
        if x in its_range:
            output[region_name] = True

基本上,您可以用一些数据 (if) 和循环替换 region_info 语句。

答案 2 :(得分:0)

我会这样做:

将您的范围存储在字典中:

ranges = {'region1' : {'min':0, 'max': 10},
          'region2' : {'min':10, 'max': 30},
          'region3' : {'min':30, 'max': 50},
          'region4' : {'min':50, 'max': 90}}

遍历 dict 并进行比较:

def assign_regions(x_min, x_max):
    return {region: x_max>range_['min'] and x_min<range_['max']
            for region, range_
            in ranges.items()}
相关问题