Python切片操作深入详解


Posted in Python onJuly 27, 2018

本文实例讲述了Python切片操作。分享给大家供大家参考,具体如下:

我们基本上都知道Python的序列对象都是可以用索引号来引用的元素的,索引号可以是正数由0开始从左向右,也可以是负数由-1开始从右向左。

在Python中对于具有序列结构的数据来说都可以使用切片操作,需注意的是序列对象某个索引位置返回的是一个元素,而切片操作返回是和被切片对象相同类型对象的副本。

如下面的例子,虽然都是一个元素,但是对象类型是完全不同的:

>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0]
0
>>> alist[0:1]
[0]

通常一个切片操作要提供三个参数 [start_index:  stop_index:  step]

start_index是切片的起始位置
stop_index是切片的结束位置(不包括)
step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。

step 是正数时,以list[start_index]元素位置开始, step做为步长到list[stop_index]元素位置(不包括)为止,从左向右截取,

start_indexstop_index不论是正数还是负数索引还是混用都可以,但是要保证 list[stop_index]元素的【逻辑】位置

必须在list[start_index]元素的【逻辑】位置右边,否则取不出元素。

比如下面的几个例子都是合法的:

>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[1:5]
[1, 2, 3, 4]
>>> alist[1:-1]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> alist[-8:6]
[2, 3, 4, 5]

step 是负数时,以list[start_index]元素位置开始, step做为步长到list[stop_index]元素位置(不包括)为止,从右向左截取,

start_indexstop_index不论是正数还是负数索引还是混用都可以,但是要保证 list[stop_index]元素的【逻辑】位置

必须在list[start_index]元素的【逻辑】位置左边,否则取不出元素。

比如下面的几个例子都是合法的:

>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[-1: -5: -1]
[9, 8, 7, 6]
>>> alist[9: 5: -1]
[9, 8, 7, 6]
>>> alist[-1:1:-1]
[9, 8, 7, 6, 5, 4, 3, 2]
>>> alist[6:-8:-1]
[6, 5, 4, 3]

假设list的长度(元素个数)是length, start_indexstop_index在符合虚拟的逻辑位置关系时,

start_indexstop_index的绝对值是可以大于length的。比如下面两个例子:

>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[-11:11]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[11:-11:-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

另外start_indexstop_index都是可以省略的,比如这样的形式 alist[:], 被省略的默认由其对应左右边界起始元素开始截取。

看一下具体的实例:

>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Python中切片操作的实现机制

(注:Python中前后双下划线名字的方法(函数)叫特殊方法,也有称魔术方法的,这是从ruby那里借用的。

通常特殊方法都是应当由解释器去调用的,对程序员的接口通常是看起来更简洁的方式,如常见的 len(list)

实质是解释器调用list.__len__()方法。)

实际上在Python中对list引用元素和形式优雅简洁的切片操作都是由解释器调用的list.__getitem__(x)特殊方法。

>>> help(list.__getitem__)
Help on method_descriptor:
__getitem__(...)
  x.__getitem__(y) <==> x[y]

其中x可以是个整数对象或切片对象。

alist[5]alist.__getitem__(5) 是完全等效的。

>>> alist[5]
5
>>> alist.__getitem__(5)
5
>>>

而切片操作是把切片对象作参数调用__getitem__()

>>> help(slice)
Help on class slice in module builtins:
class slice(object)
 | slice(stop)
 | slice(start, stop[, step])
 |
 | Create a slice object. This is used for extended slicing (e.g. a[0:10:2]).

见下面的例子。

>>> alist[1:7:2]
[1, 3, 5]
>>> slice_obj = slice(1,7,2)
>>> alist.__getitem__(slice_obj)
[1, 3, 5]
>>>

一些常用的切片操作

>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 取前一部分
>>> alist[:5]
[0, 1, 2, 3, 4]
# 取后一部分
>>> alist[-5:]
[5, 6, 7, 8, 9]
# 取偶数位置元素
>>> alist[::2]
[0, 2, 4, 6, 8]
# 取奇数位置元素
>>> alist[1::2]
[1, 3, 5, 7, 9]
# 浅复制,等价于list.copy()更加面向对象的写法
>>> blist = alist[:]
>>> blist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 返回一个逆序列表,推荐reversed(list)的写法,更直观易懂。
>>> alist[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# 在某个位置插入多个元素
>>> alist[3:3] = ['a','b','c']
>>> alist
[0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
# 在开始位置之前插入多个元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[:0] = ['a','b','c']
>>> alist
['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 替换多个元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0:3] = ['a','b','c']
>>> alist
['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]
# 删除切片
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del alist[3:6]
>>> alist
[0, 1, 2, 6, 7, 8, 9]

从上面这些实例可以看到Python的切片操作非常灵活、强大、简洁、优雅,如果能全面掌握和正确运用将会对你的编写Python代码水平会有很大提升。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之print详解
Sep 28 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python检测某个变量是否有定义的方法
May 20 Python
Python自动登录126邮箱的方法
Jul 10 Python
python与C互相调用的方法详解
Jul 14 Python
python在文本开头插入一行的实例
May 02 Python
使用python快速实现不同机器间文件夹共享方式
Dec 22 Python
PYcharm 激活方法(推荐)
Mar 23 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
python解析json数据
Apr 29 Python
对Tensorflow中的变量初始化函数详解
Jul 27 #Python
JavaScript中的模拟事件和自定义事件实例分析
Jul 27 #Python
浅谈tensorflow中几个随机函数的用法
Jul 27 #Python
tensorflow 中对数组元素的操作方法
Jul 27 #Python
Python读取excel中的图片完美解决方法
Jul 27 #Python
tensorflow实现图像的裁剪和填充方法
Jul 27 #Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 #Python
You might like
php中引用符号(&amp;)的使用详解
2013/11/13 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
JS实现两个大数(整数)相乘
2014/04/28 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
Vue的elementUI实现自定义主题方法
2018/02/23 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
a标签调用js的方法总结
2019/09/05 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
python中对list去重的多种方法
2014/09/18 Python
python基础教程之五种数据类型详解
2017/01/12 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
安装python及pycharm的教程图解
2019/10/10 Python
Pytorch之contiguous的用法
2019/12/31 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
宠物店的创业计划书范文
2014/01/11 职场文书
先进党支部申报材料
2014/12/24 职场文书
建筑质检员岗位职责
2015/04/08 职场文书
教师节倡议书2015
2015/04/27 职场文书
基层党支部承诺书
2015/04/30 职场文书
新教师教学工作总结
2015/08/12 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书