当前位置: 首页 > news >正文

Python高级特性之切片

切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割。注意这与你使用的索引操作符十分相似。记住数是可选的,而冒号是必须的。

切片操作符中的第一个数(冒号之前)表示切片开始的位置,第二个数(冒号之后)表示切片到哪里结束,第三个数(冒号之后)表示切片间隔数。如果不指定第一个数,Python就从序列首开始。如果没有指定第二个数,则Python会停止在序列尾。注意,返回的序列从开始位置开始 ,刚好在 结束 位置之前结束。即开始位置是包含在序列切片中的,而结束位置被排斥在切片外。

这样,shoplist[1:3]返回从位置1开始,包括位置2,但是停止在位置3的一个序列切片,因此返回一个含有两个项目的切片。类似地,shoplist[:]返回整个序列的拷贝。shoplist[::3]返回位置3,位置6,位置9…的序列切片。

你可以用负数做切片。负数用在从序列尾开始计算的位置。例如,shoplist[:-1]会返回除了最后一个项目外包含所有项目的序列切片,shoplist[::-1]会返回倒序序列切片。

使用Python解释器交互地尝试不同切片指定组合,即在提示符下你能够马上看到结果。序列的神奇之处在于你可以用相同的方法访问元组、列表和字符串。


Python中含有六种内建序列类:list, tuple, string, unicode, buffer, xrange。其中xrange比较特殊,它是一个生成器,其他几个类型具有的一些序列特性对它并不适合。

>>> a = 'Iloveyou' 
>>> len(a) 
8 
>>> max(a) 
'y' 
>>> min(a) 
'I' 
>>> bool('o' in a) 
True 
>>> a + a 
'IloveyouIloveyou' 
>>> a*3 
'IloveyouIloveyouIloveyou' 
>>> a[1:4] 
'lov' 
>>> a.index('y') 
5 
>>> a[5] 
'y' 

一般说来,具有序列结构的数据类型都可以使用:index, len, max, min, in, +, *, 切片。如:

切片操作

对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]。

start_index:表示是第一个元素对象,正索引位置默认为0;负索引位置默认为 -len(consequence)

end_index:表示是最后一个元素对象,正索引位置默认为 len(consequence)-1;负索引位置默认为 -1。

step:表示取值的步长,默认为1,步长值不能为0。

[注意]对于序列结构数据来说,索引和步长都具有正负两个值,分别表示左右两个方向取值。索引的正方向从左往右取值,起始位置为0;负方向从右往左取值,起始位置为-1。因此任意一个序列结构数据的索引范围为 -len(consequence) 到 len(consequence)-1 范围内的连续整数。

切片操作会将按照给定的索引和步长,截取序列中由连续的对象组成的片段,单个索引返回值可以视为只含有一个对象的连续片段。

切片的过程是从第一个想要的对象开始,到第一个不想要的对象结束。第一个想要的对象到第一个不想要的对象之间的连续对象就是你所有想要的对象。

因此在consequence[start_index: end_index]中,切片中包含了consequence[start_index],但不包括consequence[end_index]。

切片的操作类型:

con[start_index]:返回索引值为start_index的对象。start_index为 -len(con)到len(con)-1之间任意整数。

con[start_index: end_index]:返回索引值为start_index到end_index-1之间的连续对象。

con[start_index: end_index : step]:返回索引值为start_index到end_index-1之间,并且索引值与start_index之差可以被step整除的连续对象。

con[start_index: ]:缺省end_index,表示从start_index开始到序列中最后一个对象。

con[: end_index]:缺省start_index,表示从序列中第一个对象到end_index-1之间的片段。

con[:]:缺省start_index和end_index,表示从第一个对象到最后一个对象的完整片段。

con[::step]:缺省start_index和end_index,表示对整个序列按照索引可以被step整除的规则取值。

在使用单索引对序列寻址取值时,你所输入的索引值必须是处于 -len(consequence) 到 len(consequence)-1 之间的值,否则会报错提示索引值超出范围。如:

>>> a=[1,2,3,4,5,6,7] 
>>> a[len(a)-1] 
7 
>>> a[-len(a)] 
1 
>>> a[len(a)] 
  
Traceback (most recent call last): 
  File "<pyshell#98>", line 1, in <module> 
    a[len(a)] 
IndexError: list index out of range 
>>> a[-len(a)-1] 
  
Traceback (most recent call last): 
  File "<pyshell#99>", line 1, in <module> 
    a[-len(a)-1] 
IndexError: list index out of range 

其中a[len(a)-1]等同于a[-1],a[-len(a)]等同于a[0],分别表示序列的最后一个和第一个对象。

当使用冒号(:)对序列进行切片取值时,你所输入的无论是start_index或者end_index,都不必局限于 -len(a) 和 len(a)-1 之间,因为只有当你输入的索引号处于这个区间时才真正有效,而当你输入的索引号超出这个范围时,python会自动将start_index或end_index设定为缺省值(即第一个对象和最后一个对象)。如:

>>> a[-100:100] 
[1, 2, 3, 4, 5, 6, 7] 

[注意]一定要记住,end_index其实是你第一个不想要获取的对象的索引,所以a[0:-1]是取不到a[-1]的,所以如果要使得切片片段包含end_index位置的对象,请缺省end_index,或者输入一个超出end_index范围的值。

利用步长对序列进行倒序取值

在切片运算中,步长为正,表示从左至右,按照索引值与起始位置索引之差可以被步长整除的规律取值;当步长为负,则表示从右至左,按照按照索引值与起始位置索引之差可以被步长整除的规律取值。

根据这个特性,我们可以很方便对某个序列进行倒序取值,这个方法比reverse方法更方便,且适用于没有reverse方法的字符串和元组。

>>> a=[1,2,3,4,5,6,7] 
>>> b=(1,2,3,4,5,6,7) 
>>> c='Let me show you a little thing' 
>>> a[::-1] 
[7, 6, 5, 4, 3, 2, 1] 
>>> b[::-1] 
(7, 6, 5, 4, 3, 2, 1) 
>>> c[::-1] 
'gniht elttil a uoy wohs em teL' 
>>> a 
[1, 2, 3, 4, 5, 6, 7] 
>>> b 
(1, 2, 3, 4, 5, 6, 7) 
>>> c 
'Let me show you a little thing' 
  
>>> a.reverse() 
>>> a 
[7, 6, 5, 4, 3, 2, 1] 


相对reverse而言,切片的方法不会改变列表的结构,所以这是在实际应用中比较有用的一个技巧。

参考

[1]http://blog.csdn.net/werm520/article/details/7617376

[2]http://developer.51cto.com/art/201304/389771.htm

相关文章:

  • Python 模块
  • Python 简易TCP客户端
  • Python 简易UDP客户端/服务端
  • Python TCP 服务端
  • python socket编程详细介绍
  • 关于ctrl组合键,你知道多少?
  • [python开发模拟netcat工具] BHPnet
  • 算法讲解之Dynamic Programing —— 区间DP [变形:环形DP]
  • codevs 3304 水果姐逛水果街Ⅰ 题解
  • 算法讲解之Dynamic Programing —— 背包DP [资源分配问题]
  • [CDOJ 838]母仪天下 【线段树手速练习 15分钟内敲完算合格】
  • Lonlife-ACM 1014 - Absolute Defeat [差分]
  • [转]ACM 取石子问题
  • 浅谈CSRF攻击方式
  • Arp攻击实战
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【剑指offer】让抽象问题具体化
  • C语言笔记(第一章:C语言编程)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Git 使用集
  • linux安装openssl、swoole等扩展的具体步骤
  • PAT A1092
  • PHP的类修饰符与访问修饰符
  • React-flux杂记
  • Redis 中的布隆过滤器
  • underscore源码剖析之整体架构
  • vue 配置sass、scss全局变量
  • 动态规划入门(以爬楼梯为例)
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 关于for循环的简单归纳
  • 简单易用的leetcode开发测试工具(npm)
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 06-01 点餐小程序前台界面搭建
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (10)STL算法之搜索(二) 二分查找
  • (9)目标检测_SSD的原理
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (安卓)跳转应用市场APP详情页的方式
  • (九十四)函数和二维数组
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转) Face-Resources
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net Remoting常用部署结构
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NetCore项目nginx发布
  • .NET单元测试
  • .net中应用SQL缓存(实例使用)
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @Autowired注解的实现原理
  • @基于大模型的旅游路线推荐方案