1 #索引用来对单个元素进行访问,使用分片可以对一定范围内的元素进行访问,分片通过冒号相隔的两个索引实现。 2 >>>number=[1,2,3,4,5,6,7,8,9,10] 3 >>>number[1:3] #取索引为第一和第二的元素 4 [2,3] 5 >>>number[-3:-1] #负数从右开始计数,取得倒数第三和倒数第二的元素 6 [8,9] 7 #因此可以看出,分片既支持正数索引,也支持负数索引。
1 #分片的实现需要提供两个索引作为边界,第一个索引的元素包含在分片内,第二个索引的元素不包含在分片内。像数学里的a≤x<b,x是我们需要得到的元素,a是分片操作中的第一个索引,b是第二个索引,b不包含在x的范围内。 2 >>>number=[1,2,3,4,5,6,7,8,9,,10] 3 >>>number[7:10] #取最后3个元素 4 [8,9,10] 5 >>>number[10] #超出索引范围 6 Traceback (most recent call last): 7 File "<pyshell#31>", line 1, in <module> 8 number[10] 9 IndexError: list index out of range 10 #number的编号最大应该为9,编号为10指向的是第11个元素,是一个不存在的元素,但是由于在最后一个元素之后,因此能得到最后一个元素 11 >>>number=[1,2,3,4,5,6,7,8,9,10] 12 >>>number[-3:-1] 13 [8,9] 14 #没有输出最后一个元素。再试试使用索引0作为最后一个元素的下一个元素,输入如下: 15 >>>number[-3:0] 16 [] 17 #输出并没有数值。分片中最左边的索引比它右边的索引晚出现在序列中,结果就是一个空序列。比如上例中,-3代表倒数第三个元素,0代表第一个元素,倒数第三个元素比第一个元素晚出现,即排在第一个元素后面,所以得到的结果是空序列。 18 #那么我们如何通过负数索引的方式取得最后一个元素呢?要取得的分片包括序列结尾的元素,只需将第二个索引设置为空即可。输入如下: 19 >>>number[-3:] 20 [8,9,10]
1 #正数索引亦可使用这种方法,输入如下: 2 >>>number[0:] #从第一个元素开始输出,输出全部结果 3 [1,2,3,4,5,6,7,8,9,10] 4 >>>number[:0] #最后一个元素为第一个,输出为空 5 [] 6 >>>number[:3] #取得前3个元素 7 [1,2,3]
1 #根据上述输出结果可知,若需要输出整个序列,则可以将两个索引都设置为空。输入如下: 2 >>>number[:] 3 [1,2,3,4,5,6,7,8,9,10] 4 #输出结果就是整个序列
1 #进行分片时,分片的开始和结束点都需要指定(无论是直接还是间接),用这种方式取连续的元素没有问题,但若要取序列中不连续的元素就比较麻烦,或者直接不能操作。比如要取序列number中所有的奇数,以一个序列展示出来,用前面的方法就不能实现了 2 #对于上面这种情况,Python为我们提供了另一个参数--步长,该参数通常是隐形设置的。在普通分片中,步长是1.分片操作就是按照这个步长逐个遍历序列的元素,遍历后返回开始和结束点之间的所有元素。也可以理解为默认步长是1,即没有设置步长时,步长隐形设置值为1,输入如下 3 >>>number[0:10:1] #设置步长值为1 4 [1,2,3,4,5,6,7,8,9,10] 5 >>>number[0:10:2] #设置步长值为2 6 [1,3,5,7,9] 7 #由上面的输出结果可以看到,对于number序列,设置步长为2时,得到的结果就是我们前面想要的奇数序列。
1 #由结果可知,步长设置为大于1的数时,会得到一个跳过某些元素的序列。例如,我们上面设置的步长为2,得到的序列是从开始到结束每隔1个元素的序列。比如还可以这样使用: 2 >>>number[0:10:3] 3 [1,4,7,10] 4 >>>number[2:6:3] 5 [3,6] 6 >>>number[2:5:3] 7 [3] 8 >>>number[1:5:3] 9 [2,5] 10 #由以上输出可以看到,使用步长的方式还是很灵活的。
1 #除了上面的使用方式外,设置前面两个索引为空的捷径也可以使用。如下 2 >>>number[::3] 3 [1,4,7,10] 4 上面的操作将序列中每3个元素的第一个提取出,前面两个索引都设置为空。步长设置为0是否可行呢?输入如下: 5 >>>number[::0] 6 Traceback (most recent call last): 7 File "<pyshell#56>", line 1, in <module> 8 number[::0] 9 ValueError: slice step cannot be zero 10 输出结果告诉我们步长不能为0.
1 步长能否设置为负数呢?输入如下: 2 >>>number[10:0:-2] 3 [10,8,6,4,2] 4 >>>number[0:10:-2] 5 [] 6 >>>number[::-2] 7 [10,8,6,4,2] 8 >>>number[5::-2] 9 [6,4,2] 10 >>>number[:5:-2] 11 [10.8] 12 >>>number[::-1] 13 [10,9,8,7,6,5,4,3,2,1] 14 >>>number[10:0:-1] #第二索引为0,取不到序列中的第一个元素 15 [10, 9, 8, 7, 6, 5, 4, 3, 2] 16 >>>number[10::-1] #设置第二个索引为空,可以去到序列的一个元素 17 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 18 >>>number[2::-1] #设置第二个索引为空,可以去到序列的一个元素 19 [3,2,1] 20 >>>number[2:0:-1] #设置第二个索引为0,取不到序列中的第一个元素 21 [3, 2] 22 #使用负数的步长和使用正数的步长的结果是相反的。对于正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素;对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素,正数步长必须让开始点小于结束点,而负数步长必须让开始点大于结束点。
最新评论