Python中嵌套整数区间的计算

2024-10-06 08:08:17 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题是关于嵌套整数区间的区间比较。在

假设有三个整数范围,为了简单起见,我称之为目标范围。这些目标范围从不重叠,但长度可能不同。在

> target1 = range(1,10000)
> target2 = range(10001,20000)
> target3 = range(20001,25000)

进一步假设另一个范围,我称之为测试范围,它的长度总是比任何一个目标范围都要短,但可能会交叉到相邻的目标范围内。在

^{pr2}$

有没有一个Python函数可以帮助识别哪个目标范围a测试范围属于哪个范围?如果测试范围与相邻目标范围交叉,则只应给出包含测试范围最大比例的目标范围。在

> sought_function(test1, [target1, target2, target3])
# 1
> sought_function(test2, [target1, target2, target3])
# 2

编辑1

如果没有一个标准的Python函数来比较嵌套的整数区间,您将使用什么代码?下面是一些快速而笨拙的Python代码,该函数名为nested_in_,当然可以改进。在

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

Tags: and函数intest目标rangefunction整数
2条回答

如果你把每个范围看作一组。您需要一个目标范围,使您与测试集有最大的交集。在

因此,如果计算每个目标和测试之间的交集长度,并返回最大交集的索引,那么您应该得到您想要的结果。在

下面是一些粗略的代码:

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

不确定您正在尝试执行的操作,但如果要检查目标范围中是否包含测试范围,可以执行以下操作:

test1[0] in target1 and test1[-1] in target1
=> True

相关问题 更多 >