python中slice参数过长的处理方法及实例
作者:小妮浅浅 发布时间:2023-07-13 13:12:10
标签: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, "slice step cannot be zero");
return -1;
}
/* step 的最小值,他是根据 size_t 来定义的
* #define PY_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'
来源:https://www.py.cn/jishu/jichu/21975.html
0
投稿
猜你喜欢
- 前言本文主要给大家介绍了关于golang分页算法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧示例代码如下://
- try ...except 是最常见的捕获处理异常的结构,其主要作用是将可能出现问题的代码块用try :包裹起来,不至于出现错误让程序崩溃,
- 相信互联网的从业者都有同一个顾虑,那就是怎样将自己网站的用户牢牢抓住。如果以用户的角度来讲,任何网站其实都是一样的,都是我获取东西、获取服务
- # 建表CREATE TABLE `T_TEST` ( `Id` int(11) NOT NULL AUTO_INCREMENT
- Pytorch调用forward()函数Module类是nn模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想
- 本人已经在运维行业工作了将近十年,我最早接触Linux是在大二的样子,那时候只追求易懂,所以就选择了Ubuntu作为学习、使用的对象,它简单
- numpy作为python科学计算的基础模块,支撑起了pandas、matplotlib等使用。其中,ndarray作为numpy的重要
- 做过主页的朋友,几乎没有一个人没用到它,它使我们排版更加轻松。有人说DW的表格没有Fp的好用,我认为不
- 如何使DIV居中,div垂直居中,div水平居中.这个问题在用CSS来设计网页的时候经常会遇到,如果用传统的表格来布局是很简单的,CSS里就
- 很多朋友希望,我能把我做网站的一些流程及经验跟大家分享一下,最近刚好做一次内部培训,所以稍微整理了一下,这些只是针对网页初学者,具有一定平面
- 摘要:本文主要是讲解怎么样替换某一列的一个值。应用场景:假如我们有以下的数据集:我们想把里面不是pre的字符串全部换成Nonpre,我们要怎
- 原理:第一步:应用程序把查询SQL语句发给服务器端执行。我们在数据层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给
- 现在基于WEB页的HTML的编辑器在新闻系统,文章系统中用得越来越广,一个网页一粘就可以保持原来的样式,同时图片也可以在这个页中保持。但是在
- Jupyter Notebook读取csv文件失败1.IndentationError: expected an indented bloc
- 我一直使用Microsoft的FrontPage 98来开发ASP/ADO之类的Internet数据库应用程序。现在我听说许多人都非常信奉采
- 这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql>
- 一、题目描述题目内容:题目示例:题目解析:1 <= nums.length <= 104-107 <= nums
- 一、简介是一个 python 内置包,不需要额外安装即可使用urllib 是 Python 标准库中用于网络请求的库,内置四个模块,分别是u
- //定义一个对象数组 var data = [{ name: "jiang", age: 22 }, { name: &
- 在上一篇博客中,已经将环境搭建好了。现在,我们利用搭建的环境来运行一条测试脚本,脚本中启动一个计算器的应用,并实现加法的运算。创建模拟器在运