python中slice参数过长的处理方法及实例


Posted in Python onDecember 15, 2020

很多小伙伴对于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'

到此这篇关于python中slice参数过长的处理方法及实例的文章就介绍到这了,更多相关python中slice参数过长如何处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
python如何实现远程控制电脑(结合微信)
Dec 21 Python
python队列queue模块详解
Apr 27 Python
python3.X 抓取火车票信息【修正版】
Jun 19 Python
Python获取网段内ping通IP的方法
Jan 31 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
Django REST框架创建一个简单的Api实例讲解
Nov 05 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
Python基于pyecharts实现关联图绘制
Mar 27 Python
python 读取二进制 显示图片案例
Apr 24 Python
Python抖音快手代码舞(字符舞)的实现方法
Feb 07 Python
pandas 操作 Excel操作总结
Mar 31 Python
关于django python manage.py startapp 应用名出错异常原因解析
Dec 15 #Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 #Python
详解python中的异常捕获
Dec 15 #Python
python 6种方法实现单例模式
Dec 15 #Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 #Python
Python爬虫开发与项目实战
Dec 16 #Python
python中reload重载实例用法
Dec 15 #Python
You might like
星际实力自我测试
2020/03/04 星际争霸
ThinkPHP简单使用memcache缓存的方法
2016/11/15 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
javascript处理table表格的代码
2010/12/06 Javascript
基于jQuery架构javascript基础体系
2011/01/01 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
Vue 去除路径中的#号
2018/04/19 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
微信小程序之 catalog 切换实现解析
2019/09/12 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
[02:03]永远的信仰DOTA2 中国军团历届国际邀请赛回顾
2016/06/26 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
python将字符串转换成数组的方法
2015/04/29 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
巴西宠物商店:Cobasi
2019/04/19 全球购物
医学生自我鉴定范文
2014/03/26 职场文书
校园演讲稿汇总
2014/05/21 职场文书
员工工作自我评价
2014/09/26 职场文书
2015年招聘工作总结
2014/12/12 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
四年级语文教学反思
2016/03/03 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js