这个问题是关于嵌套整数区间的间隔比较。
假设三个整数范围,为简单起见,我称之为目标范围。这些目标范围从不重叠,但可能长度不同。
> target1 = range(1,10000)
> target2 = range(10001,20000)
> target3 = range(20001,25000)
进一步假设另一个范围,我称之为测试范围,其长度始终小于任何目标范围,但可能会进入相邻的目标范围。
> test1 = range(900,5000) # entirely in target1
> test2 = range(9900,10500) # mostly in target2, but crosses into target1
是否有一个Python函数可以帮助确定目标范围 测试范围属于哪个目标范围?如果测试范围穿过相邻的目标范围,则只应给出占据测试范围最大比例的目标范围。
> sought_function(test1, [target1, target2, target3])
# 1
> sought_function(test2, [target1, target2, target3])
# 2
编辑1 :
如果没有用于嵌套整数区间间隔比较的标准Python函数,您会使用什么代码?下面是一个名为 nested_in_which 的函数的一些快速而笨重的Python代码,当然可以对其进行改进。
def nested_in_which(test, targets):
for n, t in enumerate(targets):
if test[0] in t and test[-1] in t:
return(n)
else:
if test[0] in t and n < len(targets) and test[-1] in targets[n+1]:
return(n+1) # Overlap comparison not yet implemented
答案 0 :(得分:0)
不确定是否要尝试,但如果要检查目标范围中是否包含测试范围,则可以执行以下操作:
test1[0] in target1 and test1[-1] in target1
=> True
答案 1 :(得分:0)
如果您将每个范围视为一组。您希望目标范围为您提供与测试集的最大交集。
因此,如果你计算每个目标与测试之间的交点长度并返回最大交点的索引,你应该得到你想要的。
这是一些粗略的代码:
def which_range( testRange, *targetRanges ):
testRange = set( testRange )
tests = [ ( i, len( set( targetRange ).intersection( testRange ) ) ) for i, targetRange in enumerate( targetRanges ) ]
return max( tests, key=lambda x: x[1] )[0]
>>> which_range( range(9900,10500), range(1,10000), range(10001,20000), range(20001,25000) )
1 # the second target range
>>> which_range( range(900,5000), range(1,10000), range(10001,20000), range(20001,25000) )
0 # the first target range