在python里有序集合的index位置信息可正可负,方向可以从左向右或从右向左。以“python”字符串通过list函数转化生成的列表为例,其正负位置信息index值如下所示:
0 |
1 |
2 |
3 |
4 |
5 |
'p' |
'y' |
't' |
'h' |
'o' |
'n' |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
故,切片的start、end、step也可用负数来表示。
例1:
s = "python"
print s
a = list(s)
print a
b = a[1 : -2 : 1]
print b
c = a[1 : -2 : -1]
print c
程序的执行结果如下:
python
['p', 'y', 't', 'h', 'o', 'n']
['y', 't', 'h']
[]
为何c为空呢?
原因:从起点start开始如果step为正从左向右到达end进行切片操作,如果step为负从右向左到达end进行切片操作。对b起点在左方向向右是能到达终点的,而对于c那条切片语句a[1 : -2 : -1],起点在左方向向右是无法到达终点的故结果集为空。
例2
s = "python"
print s
a = list(s)
print a
b = a[-1 : 2 : 1]
print b
c = a[-1 : 2 : -1]
print c
程序的执行结果如下:
python
['p', 'y', 't', 'h', 'o', 'n']
[]
['n', 'o', 'h']
为何b为空呢?
对于b和c所对应的取切片操作的起点start = -1、终点end = 2,但取得b的切片操作的step = 1意思是从起点从左向右到达终点,不可能,因为终点在左边故b为空的列表集。而c所对应的取切片操作的方向是step = -1即从右向左是可以最终到达终点的,故得到['n', 'o', 'h']结果。
例3
对于字符串,有序的集合,也是可以使用切片的。有的时候切片操作的start和end以及step会没有指定,这个时候是一些特殊用法,通常暗含的意思是该方向上的首尾。
s = "python"
print s[:]
print s[::1]
print s[::-1]
print "*****"
print s[1::1]
print s[1::-1]
print "*****"
print s[:5]
print s[:3:1]
print s[:3:-1]
程序执行结果:
python
python
nohtyp
*****
ython
yp
*****
pytho
pyt
no
(1) s[:]切片,[:]即全切即列表本身,即首尾都要。
(2) s[::1]切片,正向全切,正向全切结果和s[:]一样
(3) s[::-1]切片,负向全切,等价于s[len(s)-1::-1]
(4)s[1::1]切片,从index为1开始到正方向尾部所有元素。
(5)s[1::-1]切片,从index为1开始一直沿负方向(右向左)到该方向尾部。
(6)s[:5]切片,正向切到index为5 - 1 = 4为止,起点默认为该方向的起点值0。
(7)s[:3:1]切片,明确指明了正向步长为1,正向切片的终点index为3,起点默认该方向的起点值0 。
(8)s[:3:-1]切片,负方向切片的终点为3,起点默认为该方向的起点值-n 。