测试整数是否为切片的索引值

问题描述 投票:3回答:2

是否有布尔函数来测试整数是否是slice对象中包含的索引值?没有拆包startstopstep参数?

3 in slice(1,6,2)

切片不可迭代时会引发错误。

谓词应适用于任意None startstopstep参数。逻辑很简单,但希望有一个内置或包。

python slice
2个回答
5
投票

逻辑并不像你想象的那么简单,因为对于None停止或开始(取决于step的符号)这样做是没有意义的,因为你需要指定一个长度。

基本上,您要求的是range对象中的包含,它包含与切片相同的信息,但是是有效序列,并支持快速包含检查。 slice有一个indices方法来帮助转换,如果你提供你有兴趣切片的序列的长度:

def in_slice(n, s, length):
    return n in range(*s.indices(length))

0
投票

如果可以选择适当大小的范围,则可以对其应用切片并确定索引是否在范围内。

对于正/无边界,这仅仅是一个足够大的范围来包含索引本身:

i in range(i+1)[slice(start,stop,step)]

3 in range(7)[slice(1,6,2)] --> True

为了支持负边界(特别是负起点),您需要确保从start开始的索引偏移是步骤的倍数,并且该大小足够小以包括索引。这是假设存在包含索引的范围大小。否则你必须自己提供一个范围大小:

def inSlice(i,s, size = None):
    if size is None:
        step  = s.step  or 1
        start = s.start or 0
        size  = size or i+1
        if step < 0 or start <= 0:
           size = (i-min(0,start))//step*step - int(s.stop is None)
    return  i in range(size)[s]

这将提供以下结果:

inSlice( 3 , slice(1, 6, 2) )           -->  True ( size = 4 )
inSlice( 37000216 , slice(10, 100000000, 3) )   -->  True ( size = 37000217 )
inSlice( 17 , slice(-100, 10, -3) )     -->  True ( size = 117 )
inSlice( 17 , slice(-100, -10, 3) )     -->  True ( size = 117 )
inSlice( 97 , slice(100, None, -3) )    -->  True ( size = 98 )
inSlice( 107 , slice(None, 100, -3) )   -->  True ( size = 108 )
inSlice( 97 , slice(-10, None, -3) )    -->  True ( size = 107 )
© www.soinside.com 2019 - 2024. All rights reserved.