知乎问答之 Python 切片

这是一个知乎问答的补充。原问题是python中字符串 s[ : -1]是什么意思?,当时回答的内容只是对问题本身的简单回答,对 Python 切片中的重要信息是有所忽略的。如果以slice对象的方式进行切片的话,其语法是这样的:slice(start, stop[, step]),在原回答中把重要的step给忽略掉了,当然,题主也没有问到。但仍然很有必要把 Python 切片中的重要信息给补充上。所以,在这里重新整理一下 Python 切片相关知识,主要参考 Python 官方文档、博客文章、以及 Python 书籍《Python 编程快速上手 让繁琐工作自动化》和《Python 编程无师自通 专业程序员的养成》。

切片

切片是:将一个可迭代对象中元素的子集,创建为一个新的可迭代对象。可迭代对象包括所有序列类型,如基本序列类型:list, tuplerange 对象,以及特别定制的附加序列类型,strbytes。利用 Python 的切片功能可实现对序列的提取、倒序、浅复制和修改、删除元素的操作。

切片的实现方法

要实现切片有两种方法,一是索引扩展(Extending Indexing)的方式;二是slice对象的方式。语法如下所示:

索引扩展(Extending Indexing)

sequence [start:stop[:step]]start
Optional. Starting index of the slice. Defaults to 0.
stop
Optional. The last index of the slice or the number of items to get. Defaults to len(sequence).
step
Optional. Extended slice syntax. Step value of the slice. Defaults to 1.

slice对象,其实方括号(下标/索引)标记在内部使用的就是 slice 对象。

sequence [slice(start, stop[, step])]

序列元素访问复习——索引

在开始切片之前,让我们先复习一下序列元素的访问。切片的其中一种方法是索引扩展(Extending Indexing),那么要访问序列的元素可以用索引,其实切片也是访问元素的一种,区别在于切片是返回序列,而索引是返回单个元素。

序列索引只能是整数,不能是浮点值。不然将导致 TypeError 错误。序列访问支持负数索引,即:可用来从右向左查找,可迭代对象中元素的索引(必须是一个负数)。整数值 −1 指的是 列表中的最后一个索引,−2 指的是列表中倒数第二个索引,以此类推,在这里重点注意,负数索引是向后查找,从右往左的,切片同样支持负数。如下图:

列表索引可用负数表示,图片来自 GeeksforGeeks 网站的文章《String Slicing in Python》中的配图

正式开始切片

切片时包含起始索引位置的元素,但不包括结束索引位置的元素,即[start,stop)。当start + 1 == stop时返回一个元素;当start == stop时返回一个空(empty)序列。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[1:5] # ['b', 'c', 'd', 'e']
l[1:2] # ['b']
l[4:4] # []

Python 切片

作为快捷方法,你可以省略切片中冒号两边的一个索引或两个索引。省略第一个索引相当于使用 0,或列表的开始。省略第二个索引相当于使用列表的长度,意味着切片直至列表的末尾。当两个都省略时,即返回一个原索引的浅复制(shallow copy)。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[:3] # ['a', 'b', 'c']
l[0:3] # ['a', 'b', 'c']
l[4:] # ['e', 'f', 'g', 'h', 'i']
l[4:len(l)] # ['e', 'f', 'g', 'h', 'i']
l1 = l[:] # 浅复制
l is l1 # False

Python 切片

切片中的负数索引,同样从右往左向后查找。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[-7:-2] # ['c', 'd', 'e', 'f', 'g']
l[2:7] # ['c', 'd', 'e', 'f', 'g']
l[2:-5] # ['c', 'd']
l[-8:] # ['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[:-1] # ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']

Python 切片
Python 切片负数向后查找示意图,图片来自 LearnByExample.org 文章《Python List Slicing》配图

到现在为止,还没有为切片设定step值,其实是在使用默认值,默认值为1,即每次移动一个序列元素。如果想要跳过一些元素,就可以显式设定step的值。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[2:7:2] # ['c', 'e', 'g']

Python 切片

同样的,step也支持负数,也是向后采集的意思。如果setp为负数,start值必须大于stop,不然将会得到一个空(empty)序列;如果省略start值,相当于从原序列的末尾开始,如果省略stop值,相当于从原序列的开始结束;而如果start值和stop值都省略,并把step值设置为1的话,将会得到一个反转的(reversed)序列。

l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[6:1:-2] # ['g', 'e', 'c']
l[1:6:-2] # []
l[:6:-1] # ['i', 'h']
l[6::-1] # ['g', 'f', 'e', 'd', 'c', 'b', 'a']
l[::-1] # ['i', 'h', 'g', 'f', 'e', 'd', 'c', 'b', 'a']

Python 切片

切片除了可以查找序列中的元素之外,还有一些重要的功能就是修改序列/元素、删除序列元素。

# 修改
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
l[1:4] = [1, 2, 3] # 修改后结果为:['a', 1, 2, 3, 'e', 'f', 'g', 'h', 'i']
l[1:2] = [1, 2, 3] # 修改/替换后的结果为:['a', 1, 2, 3, 2, 3, 'e', 'f', 'g', 'h', 'i']# 插入
l = ['a', 'b', 'c']
l[:0] = [1, 2, 3] # 插入后结果为:[1, 2, 3, 'a', 'b', 'c']l = ['a', 'b', 'c']
l[len(l):] = [1, 2, 3] # 插入后结果为:['a', 'b', 'c', 1, 2, 3]l = ['a', 'b', 'c']
l[1:1] = [1, 2, 3] # 插入后结果为:['a', 1, 2, 3, 'b', 'c']# 删除
l = ['a', 'b', 'c', 'd', 'e']
l[1:5] = [] # 删除后结果为:['a']# 还可以用 del 语句删除序列中的部分元素
l = ['a', 'b', 'c', 'd', 'e']
del l[1:5] # 删除后结果为:['a'],效果一样

Python 切片

以上都是索引扩展(Extending Indexing)的方法实现切片,现在再来看看slice对象。同样的,可以为其指定start值和stop值,~~step是一个可选参数,默认是1~~。要注意的是slice对象可以只给一个参数,这时就相当于[:stop],如果把这个参数设为None就相当于[:]

l = ['a', 'b', 'c', 'd', 'e']
s = slice(1, 5, 2) # slice(1, 5, 2)
s = slice(1, 5) # slice(1, 5, None)
s = slice(5) # slice(None, 5, None)
s = slice(None) # slice(None, 5, None)
s = slice(None) # slice(None, None, None)

Python 切片之 slice 对象

关于 Python 切片基本就整理到此,初学者使用切片可能容易出错。需要记住的是,负数从右向左查找;切片时包含起始索引位置的元素,但不包括结束索引位置的元素,即[start,stop);当你的stop不是预期时,可以设置为stop + 1或省略,尤其是step为负数的情况下;切片中的 index不会发生list index out of range的错误。以上可能有错漏的地方,欢迎指正。作为非大神,菜鸟一只的我,拍砖也恳请轻拍。

恰饭时间。这次的 Python 切片整理是源于一个知乎问答,python中字符串 s[ : -1]是什么意思?,当时主要是摘录了两本书的相关章节内容,后面再慢慢搜索整理、补充。其实读书无论是对于新手还是老司机都是学习的好方法,这不,前段时间从阮一峰先生博客看到一个资源链接,于是也把里面的书单给整理出来了,可能是因为都是好书吧,基本上都能找到对应的中文版本。这其中还有两本免费的英文原版书,《Python Programming: An Introduction to Computer Science 》和《Learning With Python: How to Think Like a Computer Scientist》。有兴趣的可以稍作移步了解一下,就在知乎专栏文章上:自学 Python 可以选择哪些入门书籍,这当然也是源于一个知乎问答的整理自学Python可以选择哪些入门书籍?。

陈哲:自学 Python 可以选择哪些入门书籍​zhuanlan.zhihu.com

参考

Python 官方文档-术语表 slice

Python 官方文档-Python 语言参考 del 语句

GeeksforGeeks 网站文章《String Slicing in Python》

python 切片_知乎问答之 Python 切片整理相关推荐

  1. Python爬虫,知乎问答美女小姐姐图片与文字内容采集爬虫

    谢邀,人在美国,刚下飞机! 上面这段几乎是逛知乎社区的大(比)佬耳熟能详的段子,从几何起,知乎也已经蜕变成最大的段子,灌水,钓鱼贴的集合区,质量度远远没有以前那么高了,当然其中还有河蟹神兽出没,莫(牛 ...

  2. 我是如何用Python制作出知乎问答收集工具的?

    我是如何制作知乎问答收集工具的? 标签:Pyhon源码 教程 知乎爬虫 此贴仅作技术交流! 效果展示 文章目录 我是如何制作知乎问答收集工具的? @[toc] 教程 1. 首先导入所需要的包 2. 定 ...

  3. python+[:]+切片_我从C ++到Python的方式:概念上的改变

    python+[:]+切片 by asya f 由asya f 我从C ++到Python的方式:概念上的改变 (How I went from C++ to Python: a conceptual ...

  4. 好想学python机器人_拥有自动学习的Python机器人-ChatterBot

    「聊天机器人」一直是许多企业.学界在专研的东西,它可以用于许多用途上,例如淘宝会有机器人客服人员,会透过机器人来帮助你解决问题,又或者是很多聊天室都会有聊天机器人这种东西,例如Line 当中有人制作出 ...

  5. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)

    小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...

  6. python自学网站 知乎-如何自学Python拿到25K的薪资?非常感谢这11个站点!

    学习一门编程语言,除了语法,最重要的是学习解决问题.很多时候单凭自己的能力确实无法做到***解决,所以无论是搜索引擎.社区.文档还是博客,都是我们解决问题的利器. 但是难题往往不在意识,而在于资源:我 ...

  7. 头条上python广告_满大街都是Python广告,真的如广告说的那样方便吗?,学精通后真能月如过万吗?业内大佬怎么看?...

    在编程领域.Python语言已经被吹得神乎其神.很多人已经产生了一种错觉:仿佛当今编程世界,唯Python莫属,其它语言皆为渣渣. 就连地产大佬潘石屹也发微博为Python背书,不愧两者都姓" ...

  8. 六星教育python怎么样_六星教育:Python怎么学?自学Python经验分享

    近些年,随着人工智能.大数据.自动化运维等行业的兴起,Python在编程方向上得天独厚的优势也凸显出来.随着Python工程师需求的日益增多,Python薪资也随之水涨船高.学习Python的同学越来 ...

  9. 千锋python笔记_《2020千锋Python入门视频全套全开源》多实用

    确实,对于在学开发或者已经从事开发工作的小哥哥小姐姐来说,恋爱这个事还挺让人揪心的! 有对象的时候又怕嘴笨不会哄对象,总不能跟对象说你看我用代码给你画个心吧!没对象的用爬虫技术爬来各种小哥哥小姐姐的头 ...

最新文章

  1. 学习笔记(八)——jQuery(二)
  2. Bound Services
  3. server2003-多域间林之间信任配置方法详解(附图)
  4. 如何为CentOS 7配置静态IP地址
  5. week2 container and injection
  6. java collections_[20]-Collections工具类
  7. 公关营销策划书的要点及分析
  8. React - Router的基本使用介绍
  9. navicat运行db文件_navicat导入db文件_db文件转换为txt
  10. oracle职工工资数据表四表联动,oracle 学习之基础篇(四):多表查询
  11. ie浏览器通过ActiveX控件获取本机macip(附带批处理一键开启)
  12. Python数据处理基础操作
  13. 智慧水务信息化平台建设,实现供水一体化管控
  14. OpenCV打开摄像头,RGB转HSV空间
  15. 乐视更新APP,图标显示欠122亿,反向营销?贾跃亭将回国造梦?
  16. 一嗨租车宣布获老虎基金等1.34亿美元投资
  17. iconv命令utf-8文件转为gbk文件
  18. 关于w5500客户端和服务器的调试心得
  19. IGS文件格式说明与下载方式- Renix atx ANTEX: The Antenna Exchange Format
  20. php 正则表达式不包含,不包含特定字符串的php正则表达式

热门文章

  1. c# 的messageBox的各种用法
  2. beforeEach钩子与无限循环问题
  3. 小数(decimal,double) 截取两位或多位,不四舍五入
  4. php第三节(运算符)
  5. Nginx实用教程(二):配置文件入门
  6. React 错误Each child in an array or iterator should have a unique “key” prop
  7. java推断字符串是否为乱码
  8. IE6下使用jquery.bgiframe.js插件解决下拉框覆盖浮动层、Dialog的问题
  9. 解决Could not load file or assembly CefSharp.Core.dll的问题
  10. 【会话推荐】ICDM论文:探索跨会话信息感知的推荐模型