是否有布尔函数来测试整数是否是slice
对象中包含的索引值?没有拆包start
,stop
,step
参数?
3 in slice(1,6,2)
切片不可迭代时会引发错误。
谓词应适用于任意None
start
,stop
,step
参数。逻辑很简单,但希望有一个内置或包。
如果可以选择适当大小的范围,则可以对其应用切片并确定索引是否在范围内。
对于正/无边界,这仅仅是一个足够大的范围来包含索引本身:
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 )