Python 基础切片整理

知乎问答之 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可以选择哪些入门书籍?

Note:这是知乎问答的一篇恰饭稿,略有改动。原恰饭文章地址在此:知乎问答之 Python 切片整理,和如果你去摆地摊性质类似。

参考

Python 官方文档-术语表 slice

Python 官方文档-Python 标准库 内置函数 slice()

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

GeeksforGeeks 网站文章《String Slicing in Python》

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265