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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
使用python获取电脑的磁盘信息方法
Nov 01 Python
python执行精确的小数计算方法
Jan 21 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Django 请求Request的具体使用方法
Nov 11 Python
Pytorch之parameters的使用
Dec 31 Python
pytorch实现onehot编码转为普通label标签
Jan 02 Python
python如何基于redis实现ip代理池
Jan 17 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 Python
python中操作文件的模块的方法总结
Feb 04 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
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
PHP之header函数详解
2021/03/02 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
jquery的each方法使用示例分享
2014/03/25 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
angularjs 源码解析之scope
2016/08/22 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
自己使用总结Python程序代码片段
2015/06/02 Python
Python 实现链表实例代码
2017/04/07 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Python实现猜年龄游戏代码实例
2020/03/25 Python
Django更新models数据库结构步骤
2020/04/01 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
python变量的作用域是什么
2020/05/26 Python
python从PDF中提取数据的示例
2020/10/30 Python
浅谈Selenium+Webdriver 常用的元素定位方式
2021/01/13 Python
Windows和Linux动态库应用异同
2016/04/17 面试题
面试自我评价范文
2014/09/17 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
2015年学校食堂工作总结
2015/04/22 职场文书
讲座通知范文
2015/04/23 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis