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检查指定文件是否存在的方法
Jul 06 Python
python 删除非空文件夹的实例
Apr 26 Python
Python随机生成身份证号码及校验功能
Dec 04 Python
python调试神器PySnooper的使用
Jul 03 Python
Python字符串中删除特定字符的方法
Jan 15 Python
Python动态导入模块和反射机制详解
Feb 18 Python
Python itertools.product方法代码实例
Mar 27 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
如何通过python实现IOU计算代码实例
Nov 02 Python
python 如何在测试中使用 Mock
Mar 01 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 Python
一篇文章带你了解Python和Java的正则表达式对比
Sep 15 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安装全攻略:APACHE
2006/10/09 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
关于js datetime的那点事
2011/11/15 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JavaScript设计模式之工厂模式和构造器模式
2015/02/11 Javascript
JS实现模拟风力的雪花飘落效果
2015/05/13 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
JS中原始值和引用值的储存方式示例详解
2018/03/23 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
python实现的简单文本类游戏实例
2015/04/28 Python
python3操作mysql数据库的方法
2017/06/23 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
德国家具在线:Fashion For Home
2017/03/11 全球购物
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
优秀求职自荐信怎样写
2013/12/18 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
大学生求职信范文应怎么写
2014/01/01 职场文书
小区门卫管理制度
2014/01/29 职场文书
光盘行动倡议书
2014/02/02 职场文书
爱国口号
2014/06/19 职场文书
招标保密承诺书
2015/01/20 职场文书
Java对文件的读写操作方法
2022/04/29 Java/Android