python中slice参数过长的处理方法及实例
很多小伙伴对于slice参数的概念理解停留在概念上,切片的参数有三个,分别是step、start、stop。因为参数的值也是多变的,所以我们需要对它们进行下一步的处理。在之前的slice讲解中我们提到列表数据过长的问题,其中在参数中也有这样的问题存在。下面我们就step、start、stop三个参数的分别处理展开讲解,帮大家深入了解slice中的参数问题。
1.step的处理
if(r->step==Py_None){ /*step默认是1,这不难理解*/ *step=1; }else{ if(!_PyEval_SliceIndex(r->step,step))return-1; /*step不能为零,否则报ValueError,要注意的是,这个异常是在执行BINARY_SUBSCR才报出来, *在创建slice对象时如果step为0并不会报错*/ if(*step==0){ PyErr_SetString(PyExc_ValueError,"slicestepcannotbezero"); return-1; } /*step的最小值,他是根据size_t来定义的 *#definePY_SSIZE_T_MAX((Py_ssize_t)(((size_t)-1)>>1)) *所以在32为系统上就是-2147483647*/ if(*step<-PY_SSIZE_T_MAX) *step=-PY_SSIZE_T_MAX; }
2.start的处理
/*当start未设置时的默认值,length是序列的长度 *如果切片从序列头部开始(step>0),start=0 *如果切片从序列末尾开始(step<0),start=length-1*/ defstart=*step<0?length-1:0; if(r->start==Py_None){ *start=defstart; } else{ if(!_PyEval_SliceIndex(r->start,start))return-1; /*如果start是负数,其实是通过加上序列长度转化成正数的a[-1:]<=>a[4:]*/ if(*start<0)*start+=length; /*如果加上length还是小于0,也就是-start超出了序列长度,这时候会根据step的正负将start *设置为序列的开始(0)或结束(-1)位置 *a[-6:-1]<=>a[0:-1] *a[-6:-1:-1]<=>a[-1:-1:-1]*/ if(*start<0)*start=(*step<0)?-1:0; /*start超出了序列长度,这时候会根据step的正负将start *设置为序列的长度或序列长度减1(最后一个元素) *a[6:-1]<=>a[5:-1] *a[6:-1:-1]<=>a[4:-1:-1]*/ if(*start>=length) *start=(*step<0)?length-1:length; }
3.stop的处理
/*当stop未设置时的默认值,length是序列的长度 *如果切片从序列头部开始(step>0),stop=length,比最后一个元素的下标多1 *如果切片从序列末尾开始(step<0),start=-1,比第一个元素的下标少1*/ defstop=*step<0?-1:length; if(r->stop==Py_None){ *stop=defstop; }else{ if(!_PyEval_SliceIndex(r->stop,stop))return-1; /*如果stop是负数,其实是通过加上序列长度转化成正数的a[:-1]<=>a[:4]*/ if(*stop<0)*stop+=length; /*如果加上length还是小于0,也就是-stop超出了序列长度,这时候会根据step的正负将stop *设置为序列的开始(0)或结束(-1)位置 *a[3:-6]<=>a[3:0] *a[3:-6:-1]<=>a[3::-1]*/ if(*stop<0)*stop=(*step<0)?-1:0; if(*stop>=length) *stop=(*step<0)?length-1:length; }
注意:
- 指定的区间是左开右闭型
- 从头开始,开始索引数字可以省略,冒号不能省略
- 到末尾结束,结束索引数字可以省略,冒号不能省略。
- 步长默认为1,如果连续切片,数字和冒号都可以省略。
关于Python中的slice操作扩展:
Python中slice操作的完整语法:
#i默认是0 #j默认是len(S) #k的步长,默认为+1 S[i:j:k]
其中i,j,k都可以是负数:
若i<0或者k<0,等价于len(S)+i,或者len(S)+j;
若k<0,则表示将[i,k)之间的字符按照步长k,从右往左数,而不是从左往右数
>>>S='abcdefg' >>>S[-3:-1] 'ef' >>>S[-1:-3:-1]#将位于S[-1:-3]的字符子串,按照步长1,从右往左数,而不是从左往右数 'gf' >>>S[4:2:-1] 'ed' >>>S[2:4:-1]#输出空字符串 '' >>>S[::-1]#逆序 'gfedcba'
需要指出的是s[i:j:k]的形式,等价于下面的形式:
>>>S='abcdefg' >>>S[slice(None,None,-1)]#等价于使用slice对象进行数组元素的访问操作 'gfedcba'
到此这篇关于python中slice参数过长的处理方法及实例的文章就介绍到这了,更多相关python中slice参数过长如何处理内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。