数组的切片Python,python中数组切片

  数组的切片Python,python中数组切片

  a

  [0、1、2、3、4、5、6、7、8、9]

  为了总结,我们试着把切片的应用分成小的类型。

  4.1.如果切片类型只有一对冒号

  【提示】在这种情况下,步长值step为1,因此隐式假设切片方向遵循“从左向右切割”的原则。

  a

  [0、1、2、3、4、5、6、7、8、9]

  最简单的情况

  [2:6]

  [ 2,3,4,5 ]

  [2:9]

  [2、3、4、5、6、7、8]

  【提示】在这两个例子中,由于“左闭右开”原则,最后一个下标元素将从最终切片的结果集中删除。

  4.1.2切片的截止位置“出界”

  根据上述切片规则7,切片操作时索引不存在真正的“越界”问题。请结合切片规则7检查以下示例。

  [2:10]

  [2、3、4、5、6、7、8、9]

  【解析】根据“左闭右开”的原则,切片结果集包含从a[2],a [3]……到a[2]的8个元素。

  [2:20]

  [2、3、4、5、6、7、8、9]

  【解析】根据切片规则7,a[2:20]等价于a[2:20]。(10=Len(a,即列表的最右边)。下面两个例子的理由和这两个例子一样。

  一个[-3:10]

  [ 7,8,9 ]

  [3点20分]

  [ 7,8,9 ]

  4.1.3切片的起始索引位置超出了边界。

  一个[-10:-8]

  [ 0,1 ]

  一个[-100:-8]

  [ 0,1 ]

  一个[-100:2]

  [ 0,1 ]

  一个[-10:2]

  [ 0,1 ]

  【解析】根据切片规则7,a[-100:-8]等价于a[-10:-8],a[-10:2]等价于a[-100:2]。另一方面,a[-10:-8]等价于a[0:-8][a[0:2]],a[-10:2]等价于a[0:2],所以有上面的运算结果。

  4.1.4切片的起始索引或结束索引为负。

  一个[-2:6]

  []

  【解析】a[-2:6]等价于a[8:6],a[8:6]也等价于a[-2:6:1]和a[8:6:1]。此时,step=1(省略),很容易看出切片结果集是空的。

  [6:-2]

  [ 6,7 ]。

  【解析】a[6:-2]等价于a[6:8],a[6:8]也等价于a[6:-2:1]和a[6:8:1]。在这种情况下,step=1(省略),结合‘左闭右开’的原理,结果就很好理解了。

  4.1.5第2节规则的应用

  [6:2]

  []

  一个[-2:-6]

  []

  【解析】在符合切片规则2的情况下,很容易发现切片结果集为空。

  一个[-6:-2]

  [ 4,5,6,7 ]

  【解析】a[-6:-2]相当于a[4:8]。结合“左闭右开”原理,给出了容易理解的结果集[a[4],a[5],a[6],a[7][a[8]。

  4.1.6如果切片起始索引被省略

  一个

  [ 0,1,2,3 ]

  一个[:-4]

  [ 0,1,2,3,4,5 ]

  【解析】根据上面的切片规则4.1,a[:4]等价于a[0:4],a[:-4]等价于a[0:-4]。另外,a[0:-4]相当于a[0:6],结合“左”

  4.1.7当切片截止指数被省略时

  答[4:]

  [4、5、6、7、8、9]

  一个[-4:]

  [ 6,7,8,9 ]

  根据上面的切片规则5.1,a[4:]是a[4:10](10=Len) a),a[-4:]是a[6:10],a[6:]是a [63333:]

  4.1.8如果切片起始索引和定界索引被省略

  一个[:]

  [0、1、2、3、4、5、6、7、8、9]

  【解析】根据上面的切片规则4.1和5.1,a[:]等价于a[0:10](10=len) a),但是根据‘左闭右开’的原则,结果集存储的是a[0],

  4.2.有两组冒号的作品

  如果切片表达式中有两个冒号对,当step为1,即上面只有一个冒号对时,可以省略第二个冒号对。大部分情况已经解释清楚了。

  【前提】这部分使用了和上面一样的结构和内容列表A,如下图。

  a=[ 0,1,2,3,4,5,6,7,8,9 ]

  4.2.1在步骤1

  不失一般性,下面的讨论也可以假设步骤=2。先看下面这个例子。

  [2:7:2]

  [2, 4, 6]

  甲[:3:2]

  [0, 2]

  一个[:-3:2]

  [0, 2, 4, 6]

  adj .;

  [3, 5, 7, 9]

  一个

  [7, 9]

  【解析】首先注意step=2确定了从左到右的切片方向。第1步时,切片起始索引值默认为0。负数的起始或结束索引值可以转换成正数的等价索引值(例如,a[:-3:2]等价于a[:7:2]),a[-3:2]等价于a[7:2])。结合“左闭右开”的原理,这组例子应该很容易理解,这里省略细节的解释。

  4.2.2步长step是负整数

  示例1

  [8:3:-1]

  [8, 7, 6, 5, 4]

  【解析】首先注意,步长-1确定切片方向是从右向左。在此示例中,切片开始索引为8,结束索引为3。结合“左闭右开”的原则,切片结果集中的元素为[a [8],a [7],a [6],a [5],a [4],即[8,7,6,5,4]。

  示例2

  [10:0:-2]

  [9, 7, 5, 3, 1]

  【解析】首先注意,step -2确定切片方向是从右向左。其次,根据上述切片原则7,切片时,不存在指标越界。如果a[10]不存在,继续向内分析,a[9]=9。因此,结合“左闭右开”原则,切片的步长(即跨度)为2,切片结果集中的元素为[a[9],a[7],a[5],a[3],a[1]],即[9,7,5,3,1]。

  示例3

  [0:10:-2]

  []

  【解析】首先注意,step -2确定切片方向是从右向左。而切片的初始索引是0,也就是列表的左边界。这时候如果向左切片,肯定就没有元素可以切片了。因此,根据切片规则3,结果是一个空列表。

  实例4

  甲[:4:-1]

  [9, 8, 7, 6, 5]

  【解析】首先注意,步长-1确定切片方向是从右向左。此时切片的初始索引对应的是链表最右边的部分(=len (list)),即从索引10(实际上是从索引9开始,包括这个索引)从右到左方向切片到索引4(排除,以“左闭右开”为准),所以有上面的切片结果。

  实例5

  一个[:-1]

  [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

  【解析】首先注意,步长-1确定切片方向是从右向左。然后,下一个关键问题是找出当step为负并且没有提供切片初始索引和切片结束索引时,切片初始索引和切片结束索引的值是什么。结合上述规则4.2和5.2,初始索引对应于列表的最右边部分(=len (list)),切片的结束索引位置是列表的最左边部分(即参与切片的子集包含索引为0的元素)。当然,也可以根据上述规则6简单地确定最终切片结果是列表中所有原始元素的逆序。

  实例6

  [美]2

  [5, 3, 1]

  【解析】首先注意,step -2确定切片方向是从右向左。初始切片索引是5,结果集自然包含一个[5]。根据上面的分析,在这个例子中,切片的结束索引位置是列表的最左侧(即,参与切片的子集包含索引为0的元素)。从等价关系来看,a[5:-2]等价于a[5:-11:-2](下标-11对应于左边的下标-10,类似于右边的下标9。因此,在这个例子中有运行结果。

  思考问题

  A [0:-1]的结果是什么?

  一个[:-3: 2]的结果是什么?

  A [1: 6:-1]的结果是什么?

  一个[-6:-1]的结果是什么?

  连续切片运算的结果是什么:a[:8][2:5][-1:]?

  一个[2 1: 3 * 2: 7% 3]的结果是什么?

  以下代码片段的运行结果是什么?

  对于范围(1,100)[2:3][-10:]:

  打印(一)

  [提示]使用range函数生成从1到99的整数,然后取3的倍数,再取后十。

  总结

  理论上,只要条件表达式恰当,目标值可以通过单个或多个切片操作任意切割。乍一看,切片操作的基本语法比较简单,但深挖起来就不简单了。所以,如果内在的逻辑没有理解透彻,是非常容易出错的,而且这种错误有时隐藏得很深,难以察觉。

  作为补充,本文所说的“左收右开”原则,更详细地说是“始收终开”原则。也就是说,对应于开始索引的元素参与切片操作,而对应于结束索引的元素不参与。另外,步长为负,当省略切片起始索引或切片结束索引时,要结合切片没有索引越界的原则正确理解这两个索引的默认值。本文通过详细的实例总结了切片操作的各种情况。如有错误和不足请指正!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: