不是最好的措辞,但我会尽力解释。
我有 4 个区域,0 <= x < 10
、10 <= x < 30
、30 <= x < 50
、50 <= x < 90
。
我正在编写一个函数,它接受 x_min
和 x_max
,并输出所覆盖的区域。我无法以“好”方式解决的边缘情况之一是,如果范围跨越多个区域,例如x_min = 15
, x_max = 60
,输出将是:
output = {'region1' : False,
'region2' : True,
'region3' : True,
'region4' : True}
我的方法如下,我现在能想到的最佳解决方案是将 x_min
和 x_max
之间的间隔拆分为 10,并检查每个数字,但这又增加了 10 个循环(因此,对于 x_min = 15
、x_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 ........
答案 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()}