Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中嵌套整数区间的计算_Python_Python 2.7_Python 3.x_Comparison_Intervals - Fatal编程技术网

Python中嵌套整数区间的计算

Python中嵌套整数区间的计算,python,python-2.7,python-3.x,comparison,intervals,Python,Python 2.7,Python 3.x,Comparison,Intervals,这个问题是关于嵌套整数区间的区间比较 假设三个整数范围,为了简单起见,我称之为目标范围。这些目标范围从不重叠,但长度可能不同 > target1 = range(1,10000) > target2 = range(10001,20000) > target3 = range(20001,25000) 进一步假设另一个范围,我称之为测试范围,其长度始终小于任何目标范围,但可能会交叉到相邻目标范围 > test1 = range(900,5000) # entirely

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

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

> 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_的函数的一些快速而笨拙的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
def嵌套在其中(测试,目标):
对于枚举中的n,t(目标):
如果t中的测试[0]和t中的测试[-1]:
返回(n)
其他:
如果t中的测试[0]和n
不确定您想做什么,但如果您想检查测试范围是否包含在目标范围内,您可以执行以下操作:

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

如果你把每个范围看作一个集合。您需要与测试集最大相交的目标范围

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

下面是一些粗略的代码:

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

不,不存在这样的内置或标准库函数。@TigerhawkT3很公平。你能推荐一些比较整数范围的库函数吗?这有助于我在编写必要的Python代码时节省时间。我更新了我的问题来说明我的目标。似乎是执行典型操作的函数;因此,我期望有这样一个功能。非常好的建议!但是,您的代码强制用户显式输入每个测试范围,而不是简单地传递范围列表。你能适应它吗?@MichaelGruenstaeudl,这并不强制。他们可以这样称呼它:
which_range(testRange,*someIterableOfRanges)
如果你不希望函数签名是这样的,你应该在语法@MichaelGruenstaeudl上查找文档,只需在
targetRanges
之前删除
*
,它将允许您在不解压缩的情况下传入一个iterable。我理解。谢谢你的解释。