切片索引
利用python解决问题的过程中,经常会遇到从某个对象中抽取部分值的情况。“切片”操作正是专门用于实现这一目标的有力武器。
理论上,只要条件表达式得当,可以通过单次或多次切片操作实现任意目标值切取。
通过切片,可以对内置的list、str、bytes、tuple等进行切割,切割操作还可以延伸到实现了__getitem__和__setitem__这两个特殊方法的python类上。
完整的切片表达式:
someObject[start_index : end_index : step]
1)start_index:表示起始索引(包含该索引对应值)。该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定。
step为正从“起点”开始,为负从“终点”开始。故缺省时:
a. step > 0:start_index = 0
b. step < 0:start_index = -1
2)end_index:表示终止索引(不包含该索引对应值)。该参数省略时,表示一直取到数据“端点”(当然也取到了该点),至于是到“起点”还是到“终点”,同样由step参
数的正负决定。step为正时直到“终点”,为负时直到“起点”。故缺省时:
a. step > 0:end_index = len(someObject)
b. step < 0:end_index的值就无法表示了,应该是索引0的再前一个位置。
3)step:正负数均可,其绝对值大小决定了切取数据时的“步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。
当step省略时,默认为1,即从左往右以步长1取值。
注意:index为正时,表示从左往右数,起始值0为正着数的第一个元素;
index为负时,表示从右往左数,起始值-1为逆着数的第一个元素(即最后一个元素)。
只有index缺省的时候才看step的正负来判断是起点还是终点。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1. 存在2个 : 的情况
这种情况是完整的形式,如果缺省了某个值,就按默认来处理,判断步骤如下:
a. 确定start_index:正则正着数,负着逆着数,缺省则由step的正负来判断是起点还是终点。
b. 确定end_index:正则正着数,负着逆着数,缺省则由step的正负来判断是起点还是终点。
c. 由step的正负来确定切割方向,数值来确定切割步长。
>>> a[::] # [0,10), 正向 >>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[::-1] # [9,0-1), 反向 >>> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] >>> a[1:6:-1] # [1,6), 反向 >>> [] >>> a[:6:-1] # [9,6), 反向 >>> [9, 8, 7] >>> a[6::-1] # [6,0-1), 反向 >>> [6, 5, 4, 3, 2, 1, 0] >>> a[-1:-6:-1] # [-1,-6), 反向 >>> [9, 8, 7, 6, 5] >>> a[-6::-1] # [-6,0-1), 反向 >>> [4, 3, 2, 1, 0] >>> a[1:-6:-1] # [1,5), 反向 >>> [] >>> a[-1:6:-1] # [9,6), 反向 >>> [9, 8, 7]
注:当start_index表示的实际位置在end_index的左边时,表示从左往右取值,此时step必须是正数(同样表示从左往右);
当start_index表示的实际位置在end_index的右边时,表示从右往左取值,此时step必须是负数(同样表示从右往左);
即两者的取值顺序必须相同。否则都返回空。
2. 存在1个 :的情况,形式如下:
someObject[start_index : end_index]
step默认为1,正向。如果start_index和end_index也缺省,即形如 someObject[:],someObject[start_index:],someObject[:end_index],
start_index = 0,end_index = len(someObject)。
当然,不存在以下两种形式:
someObject[start_index : step] someObject[end_index : step]
3. 没有 :的情况,表示切取单个元素
>>> a[0] >>> 0 >>> a[-4] >>> 6
Python 对列表的切片是创建了新的对象的,即对切片后的列表的操作不会影响到原来的列表。
切片可以被命名
slice() 函数实现切片对象,主要用在切片操作函数里的参数传递。函数原型如下:
class slice(start, stop[, step])
下面举个例子:
items = [0, 1, 2, 3, 4, 5, 6] a = slice(2, 4) print(a.start) # 2 print(a.stop) # 4 print(items[2:4]) # [2, 3] print(items[a]) # [2, 3]