数组的切片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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。