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获取各操作系统硬件信息的方法
Jun 03 Python
python中is与双等于号“==”的区别示例详解
Nov 21 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
python编辑用户登入界面的实现代码
Jul 16 Python
python调用java的jar包方法
Dec 15 Python
Python 单例设计模式用法实例分析
Sep 23 Python
Django REST framework 单元测试实例解析
Nov 07 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python读取csv文件指定行的2种方法详解
Feb 13 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
Feb 20 Python
python Timer 类使用介绍
Dec 28 Python
浅谈Python数学建模之数据导入
Jun 23 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+DBM的同学录程序(1)
2006/10/09 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
2015/03/18 PHP
双冒号 ::在PHP中的使用情况
2015/11/05 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
php生成HTML文件的类方法
2019/10/11 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
在网页里看flash的trace数据的js类
2009/01/10 Javascript
基于jquery实现的上传图片及图片大小验证、图片预览效果代码
2011/04/12 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
Backbone.js框架中简单的View视图编写学习笔记
2016/02/14 Javascript
js鼠标按键事件和键盘按键事件用法实例汇总
2016/10/03 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python常用知识点汇总
2016/05/08 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python删除n行后的其他行方法
2019/01/28 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
CSS3实现简易版的刮刮乐效果
2016/09/27 HTML / CSS
美术兴趣小组活动总结
2014/07/07 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python
Java数组详细介绍及相关工具类
2022/04/14 Java/Android