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 相关文章推荐
Python3读取文件常用方法实例分析
May 22 Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
Django 缓存配置Redis使用详解
Jul 23 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
python实现人机猜拳小游戏
Feb 03 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
Python爬虫实战之爬取携程评论
Jun 02 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
抓取YAHOO股票报价的类
2009/05/15 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
php 截取中英文混合字符串的方法
2018/05/31 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
python实现删除文件与目录的方法
2014/11/10 Python
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
python相对企业语言优势在哪
2020/06/12 Python
python里glob模块知识点总结
2021/01/05 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
银行贷款承诺书
2014/03/29 职场文书
保密协议书范本
2014/04/22 职场文书
会计工作态度自我评价
2015/03/06 职场文书
2015年采购员工作总结
2015/04/27 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
win7配置本地ftp服务器的图文教程
2022/08/05 Servers