分片

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会从序列的头部开始向右提取元素,直到最后一个元素;对于负数步长,则是从序列的尾部开始向左提取元素,直到第一个元素,正数步长必须让开始点小于结束点,而负数步长必须让开始点大于结束点。
原文地址:https://www.cnblogs.com/DLHe/p/7661237.html