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 相关文章推荐
利用标准库fractions模块让Python支持分数类型的方法详解
Aug 11 Python
深入浅析Python中的yield关键字
Jan 24 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
详解Python正则表达式re模块
Mar 19 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
浅谈python多进程共享变量Value的使用tips
Jul 16 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
python实现统计代码行数的小工具
Sep 19 Python
python实现低通滤波器代码
Feb 26 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
Python实现EM算法实例代码
Oct 04 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微信开发之自定义菜单实现
2016/11/18 PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
2017/08/11 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jQuery UI 应用不同Theme的办法
2010/09/12 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
2014/12/10 Javascript
Javascript实现Web颜色值转换
2015/02/05 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
js实现页面导航层级指示效果
2020/08/25 Javascript
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
django使用图片延时加载引起后台404错误
2017/04/18 Python
python logging日志模块的详解
2017/10/29 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
使用python绘制二维图形示例
2019/11/22 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
初级Java程序员面试题
2016/03/03 面试题
高中生的学习总结自我鉴定
2013/10/26 职场文书
幼儿园春游活动方案
2014/01/19 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
针对吵架老公保证书
2015/05/08 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP