切片索引

利用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的正负来判断是起点还是终点。

 
下面以list为例进行讲述:
 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]

  

posted @ 2020-06-17 09:10  _yanghh  阅读(532)  评论(0编辑  收藏  举报