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将mdb数据库文件导入postgresql数据库示例
Feb 17 Python
跟老齐学Python之用Python计算
Sep 12 Python
简单介绍Python中的struct模块
Apr 28 Python
Python实现文件按照日期命名的方法
Jul 09 Python
Python实现打印螺旋矩阵功能的方法
Nov 21 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
python抓取网页内容并进行语音播报的方法
Dec 24 Python
Python3实现zip分卷压缩过程解析
Oct 09 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
详解Flask前后端分离项目案例
Jul 24 Python
如何用python批量调整视频声音
Dec 22 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP获取网卡地址的代码
2008/04/09 PHP
AES加解密在php接口请求过程中的应用示例
2016/10/26 PHP
php对象工厂类完整示例
2018/08/09 PHP
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
简单的JS时钟实例讲解
2016/01/13 Javascript
js改变css样式的三种方法推荐
2016/06/28 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
简明 Python 基础学习教程
2007/02/08 Python
python 文件和路径操作函数小结
2009/11/23 Python
Python ldap实现登录实例代码
2016/09/30 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Python爬虫实现模拟点击动态页面
2020/03/05 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
维德科技C#面试题笔试题
2015/12/09 面试题
学习普通话的体会
2014/11/07 职场文书
2014年团委工作总结
2014/11/13 职场文书
JS中如何优雅的使用async await详解
2021/10/05 Javascript
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL