Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。
格式:【start:end:step】
start:起始索引,从0开始,-1表示结束
end:结束索引
step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值
注意切片的结果不包含结束索引,即不包含最后的一位,-1代表列表的最后一个位置索引,-2代表列表倒数第二个,以此类推
切记:一定不会包括 list[end] 这个位置的值,当 end为正时 则最后一位是 list[end-1] ,end为负数时, 则最后一位为 list[end+1],一定不会到达 list[end] 这一位置
示例:
a=[1,2,3,4,5,6]
b1=a[:] #省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表
print(b1)
结果:[1, 2, 3, 4, 5, 6]
b=a[0:-1:1] #从位置0开始到结束,每次增加1,截取。不包含结束索引位置(-1为最后一个元素索引位置)
print(b)
结果:[1, 2, 3, 4, 5]
c1=a[:3] #省略起始位置的索引,以及步长。默认起始位置从头开始,默认步长为1,结束位置索引为3
print(c1)
结果:[1, 2, 3]
c=a[0:5:3] #从第一个位置到第留给位置,每3个取一个值
print(c)
结果:[1, 4]
d=a[5:0:-1] #反向取值
print(d)
结果:[6, 5, 4, 3, 2]
关键:
真正让人迷惑的是list[start:stop:step]中的start和stop的默认值。
+:即从左向右看,所以start默认是0,stop默认是索引最大值
- :即从右向左看,所以start默认是索引最大值,stop默认是0
a = list(range(10))
print(a[5:0:-1])
print(a[5:4:-1])
print(a[:3:-1]) #没有指定,step为负数,start默认为索引最大值
print(a[0:3:-1]) #指定了0,则start从0开始
print(a[9::-1]) #stop没有指定,step为负数,那么stop默认为0
输出:
[5, 4, 3, 2, 1]
[5]
[9, 8, 7, 6, 5, 4]
[]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]