我们可以从已有的序列可以截取部分,生成一个新的序列。这个过程就是切片。
因为是对序列进行切片,因此列表、元组和字符串都可以进行切片操作。
切片的基本语法:
seq[x:y] # 截取序列 seq ,从索引 x 开始 截取到 y-1 为止
首先我们回顾一下序列的索引。比如对于列表 ['a', 'b', 'c', 'x', 'y', 'z']
:
索引分为正向索引和负向索引:
- 正向索引:从 0 开始,从左至右;
- 负向索引:从 -1 开始,从右至左。
切片就是通过索引实现:
>>> li = ['a', 'b', 'c', 'x', 'y', 'z']
>>> li[2:5] # 截取索引从2到4的元素(5要减1)
['c', 'x', 'y']
>>> li[3:-2] # 截取索引3到-3的元素(-2减1就是-3)
['x']
>>> li[:4] # 如果冒号前面什么都不写,表示从0开始截取
['a', 'b', 'c', 'x']
>>> li[3:] # 如果冒号后面什么都不写,表示截取到最后一个元素
['x', 'y', 'z']
>>> li[1:-1] # 去掉第一个和最后一个
['b', 'c', 'x', 'y']
一定要注意,在切片(seq[x:y])的过程中,x 索引必须在 y 索引的左边,也就是取值必须从左到右,否则就什么都取不到。特别是正负向索引混用的时候要注意,不要搞混了:
>>> li = ['a', 'b', 'c', 'x', 'y', 'z']
>>> li[-1:2]
[]
>>> li[5:3]
[]
>>> li[-3:2]
[]
切片中还可以设置步长,也就是再使用一个冒号,步长用于表示截取的跨度,也就是隔几个取一次:
>>> li = ['a', 'b', 'c', 'x', 'y', 'z']
>>> li[1:-1:2] # 从1开始到-2结束,隔1个元素取1个值
['b', 'x']
>>> li[::-1] # 还可以通过 -1 步长来倒叙排列列表
['z', 'y', 'x', 'c', 'b', 'a']
元组与字符串也都可以进行切片,操作方式与列表相同:
>>> s = 'helloworld'
>>> s[3:8]
'lowor'
>>> s[2:-5]
'llo'
>>> t = (7,8,9,10)
>>> t[1:-1]
(8, 9)
>>> t[2:]
(9, 10)